Что такое Dependency Injection в Spring? Создание простого Spring проекта с Dependency Injection в конструкторе с атрибутами @Component, @Autowired | Редактор IntelliJ Idea и язык Java
последнее обновление: 7 апреля 2025
DI (
Dependency Injection ) используется когда классы зависят друг от друга.
Например: классу в конструкторе нужен другой класс.
Java
public class Book
{
...
public Book(Author author)
{
_author = author;
}
}
Библиотека
Spring сама автоматически создает вложенные объекты.
Spring создаст
Author объект, но для этого нужно указать
тип внедрения зависимости .
Тип внедрения зависимости - это место, где один класс будет внедряться в другой:
1) В конструкторе
Я буду использовать в моем примере ниже
Мой пример:
Есть класс
Book
Есть класс
Author
При создании
Book нужен
Author
Зачем зачем мне использовать
Spring, Dependency Injection если можно 2-мя строчками создать мои объекты:
Java
Author author = new Author();
Book book = new Book(author);
Ответ: Потому что хороший стиль указать через атрибут зависимости, а
Spring сам создаст вложенные объекты.
А самый большой плюс, то что при создании вложенных объектов они становятся слабосвязанными (
Spring создает автоматически) и от этого меньше кода и легче писать тесты.
Что такое Spring Bean и как указать зависимости в разных bean ?
Spring Bean это обычный объект, который создаётся не мной, а объект создает Spring Container .
Java
ApplicationContext context = new ClassPathXmlApplicationContext("MyConfig.xml" ); // создаем Spring Container из конфигурационного файла
Book book = (Book) context.getBean("myBookBean" );
Spring по названию myBookBean создает Book .
А так как внутри нужен Author то используя внедрение зависимостей создает Author
Зависимые объекты Spring Container создает сам
Spring Container знает как создать Book потому что использую атрибут @Component :
В начале класса буду использовать @Component ("придумываем любое название для bean ").
Для внедрения зависимости буду использовать аннотацию @Autowired в конструктор
Java
@Component ("myBookBean" )
public class Book // Класс Book это bean с названием myBookBean
{
...
@Autowired
public Book(Author author)
{
_author = author;
}
}
В начале класса буду использовать @Component ("придумываем любое название для bean ").
Java
@Component ("myAuthorBean" )
public class Author // Класс Author это bean с названием myAuthorBean
{
...
public Author()
{
_authorName = "Mark Twain" ;
}
}
В конфигурационном файле для context:component написал base-package (где размещаются наши классы):
Xml
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans" ...>
<context:component-scan base-package="com.example.springproj1" />
</beans>
Какая конфигурация лучше для IoC Spring Container (по этой конфигурации Spring будет знать как создавать bean ):
•
конфигурация в XML файле ... (используется в старых программах)
• конфигурация через атрибуты
@Component ,
@Autowired (используется в современных программах и я использую в моем примере ниже)
• конфигурация через
Java код используя
@Configuration ,
@ComponentScan ,
@Bean (иногда используют)
Конфигурация для
IoC Spring Container это объяснение для
IoC Spring Container как создавать
bean объекты.
Тот, кто контролирует все ваши классы и может управлять ими называется
ApplicationContext (IoC Spring Container)
Создаю простой Spring проект с Dependency Injection в конструкторе | Редактор IntelliJ Idea и язык Java
Скачать пример:
На заметку! У вас должна быть установлена Java JDK . Если у вас ее нет то нужно скачать и установить Java JDK ...
На заметку! У вас должна быть установлена IntelliJ IDEA Ultimate . Если у вас ее нет то нужно скачать и установить IntelliJ IDEA ...
Шаг 1. Cоздаем новый проект с типом Spring Boot
Выбираем Spring Boots :
Так как у нас простой проект, то галочки не ставим:
Проект создался:
Шаг 2. Создаем новый Book.java файл
Нажимаем правой клавишей мыши на папку моего пакета и создаем новый java файл
Напишем название Book
И выберем тип Class
Нажмем кнопку ввод
Файл создался.
Внутри файла Book.java добавим код:
package com.example.springproj1;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component("myBookBean" )
public class Book {
protected String _name;
protected Author _author;
@Autowired
public Book(Author author)
{
_name = "Tom Sawyer" ;
_author = author;
}
public void ShowBook()
{
System.out.println(_name);
_author.ShowAuthor();
}
}
Шаг 3. Создаем новый Author.java файл
package com.example.springproj1;
import org.springframework.stereotype.Component;
@Component("myAuthorBean" )
public class Author {
protected String _authorName;
public Author()
{
_authorName = "Mark Twain" ;
}
public void ShowAuthor()
{
System.out.println(_authorName);
}
}
Шаг 4. Создаем новый конфигурационный MyConfig.xml файл
Нажимаем правой клавишей мыши на папку resources и создаем новый Spring Config файл
Напишем название MyConfig
Нажмем кнопку ввод
Файл создался.
Внутри файла MyConfig.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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd" >
<context:component-scan base-package="com.example.springproj1" />
</beans>
Шаг 5. В application java файле добавим код
package com.example.springproj1;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
//@SpringBootApplication
public class SpringProj1Application {
public static void main(String[] args) {
SpringApplication.run(SpringProj1Application.class, args);
ApplicationContext context = new ClassPathXmlApplicationContext("MyConfig.xml" );
Book book = (Book) context.getBean("myBookBean" );
book.ShowBook();
}
}
На заметку!
// Вариант 1
Book book = (Book) context.getBean("myBookBean" );
// а можно так
// Вариант 2
Book book = context.getBean("myBookBean" , class.Book);
На заметку!
Чтобы Spring создавал bean мне пришлось закоментировать //@SpringBootApplication в файле SpringProj1Application.java
Шаг 6. Запускаем проект
Чтобы запустить проект надо чтобы был открыт application java файл и нажимаем на зеленый треугольник:
После запуска программы на экране увидим результат: