В этой статье объясняется концепция 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 с примерами. Если у вас все еще есть путаница, сообщите нам и получите ответ от профессионалов.