«1. Введение

В этом базовом руководстве мы узнаем, как выполнять простую настройку bean-компонентов на основе XML с помощью Spring Framework.

2. Обзор

Начнем с добавления зависимости библиотеки Spring в pom.xml:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.1.4.RELEASE</version>         
</dependency>

Последнюю версию зависимости Spring можно найти здесь.

3. Внедрение зависимостей — обзор

Внедрение зависимостей — это метод, при котором зависимости объекта предоставляются внешними контейнерами.

Допустим, у нас есть класс приложения, который зависит от службы, которая фактически обрабатывает бизнес-логику:

public class IndexApp {
    private IService service;
    // standard constructors/getters/setters
}

Теперь предположим, что IService является интерфейсом:

public interface IService {
    public String serve();
}

Этот интерфейс может иметь несколько реализаций .

Давайте кратко рассмотрим одну возможную реализацию:

public class IndexService implements IService {
    @Override
    public String serve() {
        return "Hello World";
    }
}

Здесь IndexApp — это высокоуровневый компонент, который зависит от низкоуровневого компонента, называемого IService.

По сути, мы отделяем IndexApp от конкретной реализации IService, которая может варьироваться в зависимости от различных факторов.

4. Внедрение зависимостей — в действии

Давайте посмотрим, как мы можем внедрить зависимость.

4.1. Использование свойств

Давайте посмотрим, как мы можем связать зависимости вместе, используя конфигурацию на основе XML:

<bean 
  id="indexService" 
  class="com.baeldung.di.spring.IndexService" />
     
<bean 
  id="indexApp" 
  class="com.baeldung.di.spring.IndexApp" >
    <property name="service" ref="indexService" />
</bean>    

Как видно, мы создаем экземпляр IndexService и присваиваем ему идентификатор. По умолчанию компонент является синглтоном. Кроме того, мы создаем экземпляр IndexApp.

Внутри этого bean-компонента мы внедряем другой bean-компонент, используя метод установки.

4.2. Использование конструктора

Вместо внедрения bean-компонента с помощью метода установки мы можем внедрить зависимость с помощью конструктора:

<bean 
  id="indexApp" 
  class="com.baeldung.di.spring.IndexApp">
    <constructor-arg ref="indexService" />
</bean>    

4.3. Использование статической фабрики

Мы также можем внедрить компонент, возвращенный фабрикой. Давайте создадим простую фабрику, которая возвращает экземпляр IService на основе предоставленного числа:

public class StaticServiceFactory {
    public static IService getNumber(int number) {
        // ...
    }
}

Теперь давайте посмотрим, как мы могли бы использовать приведенную выше реализацию для внедрения bean-компонента в IndexApp с использованием конфигурации на основе XML:

<bean id="messageService"
  class="com.baeldung.di.spring.StaticServiceFactory"
  factory-method="getService">
    <constructor-arg value="1" />
</bean>   
  
<bean id="indexApp" class="com.baeldung.di.spring.IndexApp">
    <property name="service" ref="messageService" />
</bean>

~~ ~ В приведенном выше примере мы вызываем статический метод getService, используя метод factory, для создания bean-компонента с идентификатором messageService, который мы внедряем в IndexApp.

4.4. Использование метода фабрики

Давайте рассмотрим фабрику экземпляров, которая возвращает экземпляр IService на основе предоставленного числа. На этот раз метод не является статическим:

public class InstanceServiceFactory {
    public IService getNumber(int number) {
        // ...
    }
}

Теперь давайте посмотрим, как мы могли бы использовать приведенную выше реализацию для внедрения bean-компонента в IndexApp с использованием конфигурации XML:

<bean id="indexServiceFactory" 
  class="com.baeldung.di.spring.InstanceServiceFactory" />
<bean id="messageService"
  class="com.baeldung.di.spring.InstanceServiceFactory"
  factory-method="getService" factory-bean="indexServiceFactory">
    <constructor-arg value="1" />
</bean>  
<bean id="indexApp" class="com.baeldung.di.spring.IndexApp">
    <property name="service" ref="messageService" />
</bean>

В приведенном выше примере мы вызываем метод getService для экземпляра InstanceServiceFactory с использованием фабричного метода для создания bean-компонента с идентификатором messageService, который мы внедряем в IndexApp.

5. Тестирование

Вот как мы можем получить доступ к настроенным bean-компонентам:

@Test
public void whenGetBeans_returnsBean() {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("...");
    IndexApp indexApp = applicationContext.getBean("indexApp", IndexApp.class);
    assertNotNull(indexApp);
}

6. Заключение

В этом кратком руководстве мы проиллюстрировали примеры того, как мы можем внедрить зависимость, используя конфигурацию на основе XML. с помощью Spring Framework.

Реализацию этих примеров можно найти в проекте GitHub — это проект на основе Maven, поэтому его легко импортировать и запускать как есть.