Spring Framework – первые шаги (Конспект шестой)

В одной из предыдущих лекций я познакомил читателя с тем, как паттерн Dependancy Injection (DI) реализован в Spring Framework и продемонстрировал, каким образом устанавливается зависимость между компонентами в файле конфигурации.

Конспект шестой : Constructor versus Setter Injection

Давайте вспомним рисунок:

Setter Injection (SI)

Setter Injection (SI)

Обратите внимание на выделенную красным цветом пиктограмму (Р) возле поля класса mailService. Она говорит о том, что связь между компонентами (DI) была выполнена через поле класса ((p)roperties), т.е. с использованием метода setMailServiece(). Подобный способ конфигурации по праву называют – Setter Injection (SI).

Думаю, что опытные разработчики догадаются, что существует и альтернативный способ конфигурирования с использованием конструктора – Constructor Injection (CI).

Давайте рассмотрим пример, иллюстрирующий CI:

<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 http://www.springframework.org/schema/context/spring-context-2.5.xsd">

	<bean id="registerFormController"
class="com.personality.examples.spring.ioc.RegisterFormControllerReadyForIoC">
		<constructor-arg>
		            <ref bean="mailService"/>
		</constructor-arg>
	</bean>

	<bean id="mailService"
		class="com.personality.examples.spring.ioc.SmtpMailService" />
</beans>

Как видите, изменения, произошедшие в файле конфигурации, в нашем случае, не значительные (выделены красным цветом). Графически подобная конфигурация будет выглядеть следующим образом:

Constructor DI expample

Constructor DI expample

Из рисунка видно, что связь между компонентами теперь установлена через конструктор, о чем говорит символ (С) в зеленой окружности.

Особый интерес для читателя может представлять конфигурирование с помощью CI компонент, содержащих в параметрах конструктора класса примитивные типы. Представьте себе ситуацию, когда Вам необходимо „поднять“ в application context компаненту, котрая отправляет почту в фоновом потоке, например каждые 10 минут, но не более 100 писем за один проход ;). Вероятнее всего, конструктор такой компоненты будет выглядеть следующим образом – public MailService(int interval, int maxMailCount);

В таком случае в файл конфигурации необходимо будет добавить следующие строки:

<bean id="mailService"
	class="com.personality.examples.spring.ioc.SmtpMailService" >

		<constructor-arg index="0" value="10"/>
		<constructor-arg index="1" value="100"/>
  	</bean>

Соответственно изменится и графическое представление подобной конфигурации:

Constructor DI example 2

Constructor DI example 2

Более подробно со всеми нюансами конфигурирования с использованием Constructor Injection пользователь может ознакомиться в разделе 3.3.1.1. Constructor Injection :: The Spring Framework – Reference Documentation.

Как видите, для нашего достаточно примитивного примера, нет разницы между использованием Setter Injection и Constructor Injection.

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

This entry was posted in Java, Main menu and tagged . Bookmark the permalink.
  • Dmitri

    Отличные статьи !! Буду ждать продолжения))

    •  Спасибо! Постараюсь оправдать ожидания 😉