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.foreach.di.spring.IndexService" />
<bean
id="indexApp"
class="com.foreach.di.spring.IndexApp" >
<property name="service" ref="indexService" />
</bean>
Как видно, мы создаем экземпляр IndexService
и присваиваем ему идентификатор. По умолчанию компонент является синглтоном. Кроме того, мы создаем экземпляр IndexApp
.
Внутри этого bean-компонента мы внедряем другой bean-компонент, используя метод установки.
4.2. Использование конструктора
Вместо того, чтобы внедрять bean-компонент с помощью метода установки, мы можем внедрить зависимость с помощью конструктора:
<bean
id="indexApp"
class="com.foreach.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.foreach.di.spring.StaticServiceFactory"
factory-method="getService">
<constructor-arg value="1" />
</bean>
<bean id="indexApp" class="com.foreach.di.spring.IndexApp">
<property name="service" ref="messageService" />
</bean>
В приведенном выше примере мы вызываем статический метод getService
, используя фабричный метод
, чтобы создать bean-компонент с идентификатором messageService
, который мы внедряем в IndexApp.
4.4. Использование заводского метода
Давайте рассмотрим фабрику экземпляров, которая возвращает экземпляр IService
на основе предоставленного числа. На этот раз метод не статичен:
public class InstanceServiceFactory {
public IService getNumber(int number) {
// ...
}
}
Теперь давайте посмотрим, как мы могли бы использовать приведенную выше реализацию для внедрения bean-компонента в IndexApp
с использованием конфигурации XML:
<bean id="indexServiceFactory"
class="com.foreach.di.spring.InstanceServiceFactory" />
<bean id="messageService"
class="com.foreach.di.spring.InstanceServiceFactory"
factory-method="getService" factory-bean="indexServiceFactory">
<constructor-arg value="1" />
</bean>
<bean id="indexApp" class="com.foreach.di.spring.IndexApp">
<property name="service" ref="messageService" />
</bean>
В приведенном выше примере мы вызываем метод getService
для экземпляра InstanceServiceFactory
, используя метод factory
для создания bean-компонента с идентификатором messageService
, который мы внедряем в IndexApp
.
5. Тестирование
Вот как мы можем получить доступ к настроенным компонентам:
@Test
public void whenGetBeans_returnsBean() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("...");
IndexApp indexApp = applicationContext.getBean("indexApp", IndexApp.class);
assertNotNull(indexApp);
}
6. Заключение
В этом кратком руководстве мы проиллюстрировали примеры того, как мы можем внедрить зависимость, используя конфигурацию на основе XML с помощью Spring Framework.
Реализацию этих примеров можно найти в проекте GitHub — это проект на основе Maven, поэтому его легко импортировать и запускать как есть.