- 05-02-2008
Spring Framework - первые шаги (Конспект шестой)
Конспект шестой : Constructor versus Setter Injection
В одной из предыдущих лекций я познакомил читателя с тем, как паттерн Dependancy Injection (DI) реализован в Spring Framework и продемонстрировал, каким образом устанавливается зависимость между компонентами в файле конфигурации.
Давайте вспомним рисунок:

Обратите внимание на выделенную красным цветом пиктограмму (Р) возле поля класса 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.xsdhttp://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>
Как видите, изменения, произошедшие в файле конфигурации, в нашем случае, не значительные (выделены красным цветом). Графически подобная конфигурация будет выглядеть следующим образом:

Из рисунка видно, что связь между компонентами теперь установлена через конструктор, о чем говорит символ (С) в зеленой окружности.
Особый интерес для читателя может представлять конфигурирование с помощью CI компонент, содержащих в параметрах конструктора класса примитивные типы. Представьте себе ситуацию, когда Вам необходимо "поднять" в application context компоненту, котрая отправляет почту в фоновом потоке, например каждые 10 минут, но не более 100 писем за один проход
. Вероятнее всего, конструктор такой компоненты будет выглядеть следующим образом - public MailService(int interval, int maxMailCount);
. Вероятнее всего, конструктор такой компоненты будет выглядеть следующим образом - 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 Injection пользователь может ознакомиться в разделе 3.3.1.1. Constructor Injection :: The Spring Framework - Reference Documentation.
Как видите, для нашего достаточно примитивного примера, нет разницы между использованием Setter Injection и Constructor Injection.
В следующей лекции мы попробуем разобраться, какой же подход является оптимальным и в каких случаях.
Vyacheslav Yakovenko
Spring Framework - первые шаги (Конспект пятый) :: Spring Framework - первые шаги (Конспект седьмой)
| Комментарии к статье "Spring Framework - первые шаги (Конспект шестой)" (7) |
| 28-02-2010 21-29 2 Виктор: Если что-то устарело - чтож, такова жизнь. Давайте править вместе. Указывайте, что конкретно, будем править ;) |
|
|
| 24-02-2009 13-28 s/компаненту/компоненту/ |
| 13-01-2009 21-01 2 постоянный читатель: Как Вам сказать - статьи из этого раздела написаны специально для этого сайта. Так что скорее всего копии как раз на других ресурсах. |
| 13-02-2008 18-06 а мне нравиться :Р |
| 11-02-2008 21-14 Ну ты даешь RedMac. Все эти статьи это копии с других сайтов. Подборка совсем не уникальна и некоторые статьи этого сайта совсем не в тему :Р |
| 11-02-2008 13-26 классная подборка -- жду продолжения |