
|
|
08-01-2008 Во время этой лекции нам предстоит разобраться с фундаментальным принципом, положенным в основу работы Spring Framework – Inversion of Control (Ioc).
И надо признаться, что это не простая задача, т.к. единства мнения в целесообразности использования этого принципа нет.
В начале нам предстоит понять, кто кого инвертирует и кто кого контроллирует.
Конспект второй : Inversion of Control vs. Dependancy InjectionВо время этой лекции нам предстоит разобраться с фундаментальным принципом, положенным в основу работы Spring Framework – Inversion of Control (Ioc). И надо признаться, что это не простая задача, т.к. единства мнения в целесообразности использования этого принципа нет. В начале нам предстоит понять, кто кого инвертирует и кто кого контроллирует. Для того, чтобы читатель не потерял нить рассуждения, я приведу пример, реализованный без каких-либо IoC и DI. Представьте себе, что вы разрабатываете серверную компоненту, которая должна обрабатывать форму регистрации пользователя и отправлять письмо администратору и самому пользователю по завершении таковой: package com.personality.examples.spring.ioc; public class RegisterFormController { private static final String MESSAGE_HELLO_WORLD = "Hello, World!";
public void send() {
MailService mailService = new SmtpMailService();
try { mailService.sendMessage(MESSAGE_HELLO_WORLD);
} catch (MailServiceSendMessageException e) { e.printStackTrace();
}// try/catch
}// send()
} MailService mailService = new SmtpMailService();
„Но ведь можно разработать фабрику, которая будет возвращать необходимый экземпляр почтового агента!“, - скажет мне искушенный в таких вопросах программист и будет по своему прав. Но ведь нам то хочется иметь возможность декларативного конфигурирования системы! И именно тут при попытке декларативно сконфигурировать нашу систему и возникнет проблема. О том, как ее решить, я расскажу чуть позже, а пока... пока мы вернемся к коду и постараемся анатомировать его. Итак, код выделенный красным цветом, говорит нам о том, что класс RegisterFormController полностью контроллирует (композиция) процесс создания экземпляра почтового клиента. Т.о. все функции по созданию экземпляров классов, будь то с помощью директивы new, или с помощью фабрики MailService.getInstance() уже не имеет для нас значения. Главное, что все эти функции сосредоточены в самом приложении. Это и есть традиционный способ инстанцирования объектов, характерных для многих приложений. Ну что же, с традиционным способом мы разобрались, теперь подошло время для того, чтобы разобраться с IoC. Я несколько модифицирую RegisterFormController, превратив его в RegisterFormControllerReadyForIoC и добавлю класс Framework, который (да простит меня Род Джонсон ), проиллюстрирует то, что делает Spring. Итак: Обратите внимание на то, что ничего сверхестественного я не сделал, а просто привел класс в соответствие с JavaBean спецификацией, добавив методы setMailService() и getMailService() и убрав инициализацию свойства mailService из класса. Т.о. класс RegisterFormControllerReadyForIoC уже не контроллирует процесс создания экземпляра почтового клиента. Ключевая фраза здесь - „уже не контроллирует“. А ведь кто-то должен этот процесс контроллировать . Переходим к созданию фреймворка: package com.personality.examples.spring.ioc; public class Framework { public static void main(String[] args) { MailService mailService = new SmtpMailService(); RegisterFormControllerReadyForIoC controller = new RegisterFormControllerReadyForIoC(); controller.setMailService(mailService); controller.send();
}
}
Как видите, в этом случае код, отвечающий за создание экземпляров классов и установления связей между ними, вынесен из класса приложения в... правильно - во фреймворк. В этом и заключается, столько раз упомянутая, инверсия. Именно этот подход и получил название - Inversion of Controll (IoC). Все сказанное выше, я постараюсь изобразить графически: 
Обратите внимание на то, что я сознательно ушел от использования UML диаграмм и постарался создать в Вашем сознании образ того, что происходит в системе, использующей один из IoC (DI) фреймворков. В следующей лекции, уважаемый читатель сможет познакомиться с тем, как же выполняется декларативная конфигурация приложения, а так же - с различными авторитетными точками зрения на IoC (DI).
В даннм случае метод main() эмулирует вызовы, котрые сделает Spring, для того чтобы подготовить среду окружения для нашего приложения. Как видите, фреймворк создает (инстанцирует) экземпляр почтового агента, затем создает (инстанцирует) экземпляр контроллера, следующим шагом внедряет экземпляр класса (Dependancy Injection) агента в контроллер и уж затем выполняет отправку сообщения. package com.personality.examples.spring.ioc; public class RegisterFormControllerReadyForIoC { private static final String MESSAGE_HELLO_WORLD = "Hello, World!";
private MailService mailService; public void send() { try { mailService.sendMessage(MESSAGE_HELLO_WORLD);
} catch (MailServiceSendMessageException e) { e.printStackTrace();
}// try/catch
}// send() public MailService getMailService() { return mailService;
} public void setMailService(MailService mailService) { this.mailService = mailService;
}
} В этой строке как раз и заключается вся соль – именно она лишает возможности полноценно использовать RegisterFormController совместно со Spring Framework. Почему, спросите вы? Ведь никакой крамолы в данном коде нет!? Совершенно верно – крамолы нет. Но, использовать полноценно этот класс не получится, т.к. если Вам понадобится не SMTP почтовый агент, а IMAP – Вам придется перерабатывать Ваш код.У приведенного выше класса есть метод send(), который и должен выполнять эту функцию. Обратите особое внимание на строку выделенную красным цветом Vyacheslav YakovenkoSpring Framework - первые шаги (Конспект первый) :: Spring Framework - первые шаги (Конспект третий)
|
Комментарии к статье "Spring Framework – первые шаги (Конспект второй)" (3) |
АлександрНеверов:
26-03-2008 10-53
по-моему на этой странице не хватает одного кусочка кода, очень важного, а вообще то статья очень хорошая, спасибо! |
Admin:
15-02-2008 13-32
Спасибо. Исправлено! |
RedMac:
13-02-2008 17-44
ссылки на переход к предыдущему и следующему конспектам затисались в середину текста |
|
|
| Веб Приложение на ОСГИ 04-08-2008 Технология OSGi позволяет создавать модульные приложения, которое легко может конфигурироваться путем добавления,удаления или обновления модулей. В данном примеры мы рассмотрим создания простейшего веб-приложения как часть (модуль) другого приложения, основанного на OSGi | | Spring Framework - первые шаги (Конспект десятый) 05-03-2008 Напомню задачу, с которой может столкнуться любой Java Developer: "В качестве контроллера в нашей подсистеме будет выступать ShoppingCartShowController, поднятый в контексте приложения как singleton. А в качестве модели, будет выступать компонента ShoppingCart, поднятая в контексте сессии". | | Spring Framework 2.5.2 Released 04-03-2008 Вышел второй апдейт для Spring 2.5, он содержит исправление ошибок найденных в версии 2.5.1 и представляет целый ряд улучшений во фреймворке. | | Spring Framework - первые шаги (Конспект девятый) 26-02-2008 Теперь давайте усложним ситуацию и представим себе, что первая компонента описана как singleton, а вторая, как prototype. Кроме этого принимаем во внимание, что «singleton» агрегирует в себе «prototype». Что будет происходить в этом случае? | | Spring Framework - первые шаги (Конспект восьмой : Beans scope) 19-02-2008 Как я и обещал в одной из предыдущих лекций, пришло время поговорить про диапазоны видимости компонент (beans scope). | | Spring Framework - первые шаги (Конспект седьмой) 12-02-2008 Сегодня мы постараемся разобраться в преимуществах и недостатках, как Constructor Injection (CI), так и Setter Injection (SI). | | Spring Framework - первые шаги (Конспект шестой) 05-02-2008 Использование Constructor и Setter Injection в Spring Framework | | Spring Framework - первые шаги (Конспект пятый) 29-01-2008 Существует несколько способов „поднятия“ application context. Для иллюстрации я остановлюсь на простейшем способе, который с успехом можно использовать при разработке юнит тестов. | | Спрос на Spring разработчиков неуклонно растет 25-01-2008 Спрос на Spring разработчиков неуклонно растет, отмечает в своем блоге Род Джонсон. | | Spring Framework - первые шаги (Конспект четвертый) 22-01-2008 Теперь, прежде чем перейти к экспериментам с фреймворком, нам осталось разобраться, собственно, каким образом Spring связывает компоненты между собой. | | Январская конференция JUG Украина :: Кластеры на основе Terracotta 19-01-2008 Последнее собрание украинского JUG прошло в достаточно шикарной обстановке отеля Hyatt Regency. Лично меня презентация, привезенная Джонасом Бонером, посвященная построению кластеров на основе Open Source продукта, разрабатываемого его компанией, Terracotta, очень порадовала. | | Spring Framework - первые шаги (Конспект третий) 14-01-2008 Прежде чем двигаться дальше и рассматривать следующие немаловажные аспекты Spring Framework, я позволю себе остановиться на мнениях относительно DI (IoC) различных авторитетных разработчиков. | | Spring Framework – первые шаги (Конспект второй) 08-01-2008 Во время этой лекции нам предстоит разобраться с фундаментальным принципом, положенным в основу работы Spring Framework – Inversion of Control (Ioc).
И надо признаться, что это не простая задача, т.к. единства мнения в целесообразности использования этого принципа нет.
В начале нам предстоит понять, кто кого инвертирует и кто кого контроллирует. | | Spring Framework – первые шаги (Конспект первый) 04-01-2008 Spring Framework – явление на Олимпе индустрии разработки программного обеспечения, достойное внимания, хотя бы потому, что Spring смог выйти за рамки Java сообщества и сделать шаг в „святая святых“ - в .Net.
Используя опыт, приобретенный мною во время преподавания на тренингах по подготовке Java разработчиков, я постарюсь в цикле статей донести до читателей нашего сайта основные концепции, заложенные в Spring. Создать „конспект лекций“, который поможет Вам сделать свои первые шаги в мир J2EE с использованием Spring Framework. | | RSS Injection (Часть 2) 31-12-2007 Ни для кого не секрет, что в последнее время RSS каналы стали не только популярным средством продвижения новостных лент, но и эффективным способом обмена информационными потоками между сайтами. В данной статье речь пойдет о том, как реализовать потребность в RSS, используя один из самых популярных фреймворков – Spring. | |
|