|
05-02-2008 Использование Constructor и Setter Injection в 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.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>
Как видите, изменения, произошедшие в файле конфигурации, в нашем случае, не значительные (выделены красным цветом). Графически подобная конфигурация будет выглядеть следующим образом: 
Из рисунка видно, что связь между компонентами теперь установлена через конструктор, о чем говорит символ (С) в зеленой окружности.
Особый интерес для читателя может представлять конфигурирование с помощью 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 Injection пользователь может ознакомиться в разделе 3.3.1.1. Constructor Injection :: The Spring Framework - Reference Documentation. Как видите, для нашего достаточно примитивного примера, нет разницы между использованием Setter Injection и Constructor Injection.
В следующей лекции мы попробуем разобраться, какой же подход является оптимальным и в каких случаях.
|