Статьи

Как работает Dependency Injection (DI) в Spring Разработка приложений Java

В этой статье объясняется концепция Dependency Injection (DI) и как она работает в разработке Java-приложений Spring. Вы узнаете о преимуществах, недостатках и основах DI на примерах. Посмотрите дальше для получения дополнительной информации.

Преимущества внедрения зависимости

  • DI позволяет клиенту гибко настраиваться. Исправлено только поведение клиента.

  • Тестирование может быть выполнено с использованием фиктивных объектов.

  • Слабо пара архитектуры.

  • DI преимущества высокой когезии:

    • Уменьшенная сложность модуля

    • Повышение удобства обслуживания системы, поскольку изменения логики в домене влияют на меньшее количество модулей.

    • Увеличенное повторное использование модуля.

  • DI не требует никаких изменений в поведении кода, его можно применять к устаревшему коду в качестве рефакторинга.

  • DI позволяет клиенту удалить все знания о конкретной реализации, которую необходимо использовать. Это более повторно используемый, более тестируемый, более читаемый код.

  • DI позволяет устранить или, по крайней мере, уменьшить ненужные зависимости.

  • DI позволяет параллельную или независимую разработку.

  • DI уменьшает связь между классом и его зависимостью.

Недостатки внедрения зависимости

  • DI создает клиентов, которые требуют настройки деталей, предоставленных строительным кодом.

  • DI может затруднить отслеживание кода, поскольку он отделяет поведение от конструкции; это означает, что разработчики обращаются к большему количеству файлов, чтобы следить за работой системы.

  • DI может вызвать взрыв типов, особенно в языках с явными типами интерфейса, таких как C # и Java.

  • DI может стимулировать зависимость от DI.

  • Тесная связь :

    • Изменение только в одном модуле обычно вызывает волновой эффект изменений в других модулях.

Инъекция зависимости (DI)

  • Dependency Injection (DI) — это шаблон разработки программного обеспечения, который реализует инверсию управления для разрешения зависимостей.

  • Инъекция — это передача зависимости зависимому объекту, который будет ее использовать.

  • DI — это процесс, посредством которого объекты определяют свои зависимости. Другие объекты, с которыми они работают, — только через аргументы конструктора или аргументы метода или свойства фабрики — задаются в экземпляре объекта после его создания или возврата из метода фабрики.

  • Затем контейнер внедряет эти зависимости и создает компонент. Этот процесс называется Inversion of Control (IoC) (сам компонент управляет созданием или расположением своих зависимостей с помощью классов прямой конструкции или локатора служб).

  • DI относится к процессу предоставления внешней зависимости к программному компоненту.

Внедрение зависимостей осуществляется двумя способами

1. Конструкторское внедрение зависимостей

  • DI на основе конструктора — это когда контейнер вызывает конструктор с несколькими аргументами, каждый из которых представляет зависимость или другой класс.

  • Вызов статического метода фабрики с конкретными аргументами для создания bean-компонента примерно эквивалентен, обработка аргументов для конструктора и статического метода фабрики. В следующем примере показан класс, который может быть внедрен в зависимости только с помощью конструктора. Это POJO, который не зависит от конкретных интерфейсов контейнера, базовых классов или аннотаций.

public class SimpleStudentList {
    // the SimpleStudentList has a dependency on StudentFind
    private StudentFind studentFind;
    // a constructor that Spring container can 'inject' a StudentFind
    public SimpleStudentList(StudentFind studentFind ) {
        this.studentFind = studentFind ;
    }
    // business logic code
}

Пример конструктора на основе DI

Book.java
package com.spring.example;  

public class Book {  
    private int id;  
    private String bookName;  

    public Book() {System.out.println("Java");}  

    public Book(int id) {this.id = id;}  

    public Book(String bookName) {  this.bookName = bookName;}  

    public Book(int id, String bookName) {  
        this.id = id;  
        this.bookName = bookName;  
    }  
    void display(){  
        System.out.println(id+" "+bookName);  
    }  
}  
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>  
<beans  
    xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:p="http://www.springframework.org/schema/p"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
                http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  

<bean id="book" class="com.spring.example.Book">  
<constructor-arg value="1" type="int"></constructor-arg>  
</bean>  

</beans>  
Main.java
package com.spring.example;  

import org.springframework.beans.factory.BeanFactory;  
import org.springframework.beans.factory.xml.XmlBeanFactory;  
import org.springframework.core.io.*;  

public class Main {  
    public static void main(String[] args) {  

        Resource r=new ClassPathResource("applicationContext.xml");  
        BeanFactory factory=new XmlBeanFactory(r);  

        Book b=(Book)factory.getBean("book");  
        b.display();  

    }  
}  
Вывод:

1 ноль

2. Установка на основе зависимостей

DI на основе установки — это когда контейнер вызывает методы setter для ваших bean-компонентов после того, как он вызвал конструктор без аргументов или статический фабричный метод без аргументов для создания экземпляра этого bean-компонента.

В следующем примере показан класс, который может иметь только чистую инъекцию сеттера.

public class SimpleStudentList {
    // the SimpleStudentList has a dependency on StudentFind
    private StudentFind studentFind;
    // a setter method that Spring container can 'inject' a StudentFind
    public void setStudentFind(StudentFind studentFind ) {
        this.studentFind = studentFind ;
    }
    // business logic
}

Пример DI на основе сеттера

Book.java
package com.spring.example;  

public class Book {  
    private int id;  
    private String bookName;  
    private String author;  

    public int getId() {  
        return id;  
    }  
    public void setId(int id) {  
        this.id = id;  
    }  
    public String getBookName() {  
        return bookName;  
    }  
    public void setBookName(String bookName) {  
        this.bookName = bookName;  
    }  

    public String getAuthor() {  
        return author;  
    }  
    public void setAuthor(String author) {  
        this.author = author;  
    }  
    void display(){  
        System.out.println(id+" "+bookName+" "+author);  
    }  
}
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>  
<beans  
    xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:p="http://www.springframework.org/schema/p"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
                http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  

<bean id="book" class="com.spring.example.Book">  
<property name="id">  
<value>1</value>  
</property>  
<property name="bookName">  
<value>The Complete Reference J2EE</value>  
</property>  
<property name="author">  
<value>Herbert Schildt</value>  
</property>  

</bean>  

</beans>  
Main.java
package com.spring.example;  

import org.springframework.beans.factory.BeanFactory;  
import org.springframework.beans.factory.xml.XmlBeanFactory;  
import org.springframework.core.io.*;  

public class Main {  
    public static void main(String[] args) {  

        Resource r=new ClassPathResource("applicationContext.xml");  
        BeanFactory factory=new XmlBeanFactory(r);  

        Book b=(Book)factory.getBean("book");  
        b.display();  

    }  
}  
Вывод :
  • Полный справочник J2EE Герберт Шильдт

Наша команда разработчиков Java-приложений только что объяснила концепцию внедрения зависимостей, ее преимущества, недостатки и использование в Spring с примерами. Если у вас все еще есть путаница, сообщите нам и получите ответ от профессионалов.