Contenu connexe
Similaire à Konstantin slisenko - Spring Framework (20)
Konstantin slisenko - Spring Framework
- 1. Обзор возможностей Inversion of Control Аспектно-ориентированное программирование © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
- 2. План презентации 1. Общие сведения о Spring Framework 2. Возможности Spring Framework 3. Inversion of Control 4. Аспектно-ориентированное программирование 5. Hello World! (java + Spring) 6. Пример: Как великий князь в поход ходил © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
- 3. 1. Общие сведения о Spring Framework Open Source Упрощает разработку enterpise-приложений (настройка, тестирование, …) Может применяться для web, десктопных, мобильных приложений. (Есть android версия) Платформы – Java, .Net (Spring.NET) Предоставляет богатый набор вспомогательных классов © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
- 4. 1. Общие сведения о Spring Framework Официальный сайт Spring Framework: springsource.org © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
- 5. 1. Общие сведения о Spring Framework © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
- 6. 2. Возможности Spring Инверсия контроля (IoC) Аспектно-ориентированное программирование Spring – этоконтейнеробъектов, нет необходимости писать в коде new, вместо этого запрашиваем объекты у него Spring – это фреймворк, который содержит библиотеки для web, orm, security, aop, ioc, mail, remoting – он предоставляет интерфейсы для абстрагирования от этих сервисов © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
- 7. 3. Inversion of Control public class MailService { public void send(String from, String to, String subject, String text) { // выполняем отправку письма } } public class BasketService { private MailService mail; public BasketService() { mail = new MailService(); } public void makeOrder() { // Сохраняем заказанные товары // Отправляем письмо mail.send(“shop@shop.com”, “customer@customer.com”, “Заказ принят”); } } © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
- 8. 3. Inversion of Control В системе много объектов, которые определённым образом между собой связаны (например, вызывают друг друга) Если мы указываем зависимости в коде: - трудно тестировать классы по отдельности - трудно подменять классыдля разных конфигураций Мы можем выделить интерфейс и соединить объекты с помощью set-метода © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
- 9. 3. Inversion of Control public interface MailService { public void send(String from, String to, String subject, String text) ; } public class MailServiceImpl implements MailService{ public void send(String from, String to, String subject, String text) { // выполняем отправку письма } } public class BasketService { private MailService mail; public void setMailService(MailService mail) { this.mail = mail; } public void makeOrder() { // Сохраняем заказанные товарыи отправляем письмо mail.send(“shop@shop.com”, “customer@customer.com”, “Заказ принят”); } } © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
- 10. 3. Inversion of Control В любом случае мыдолжны установить зависимости в коде и указывать конкретные реализации классов Решение проблемы – переложить работу по установлению зависимостей на Spring © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
- 11. 3. Inversion of Control Spring – это контейнер, который: Управляет жизненным циклом объектов Позволяет настроить, как он будет их выдавать: - синглетон - новый объект - пул объектов Позволяет настроить их автоматическое удаление Позволяет задать зависимости между ними (инжекция зависимостей) Spring IoC – основной модуль Spring © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
- 12. 3. Inversion of Control Возможна инжекция зависимостей для любых типов: - коллекции (List, Map, Set, Properties) - пользовательские классы - примитивные и стандартные типы Правила создания объектов и зависимостей между ними описываются в конфигураци-онномxml-файле © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
- 13. 3. Inversion of Control Преимущества: Мы можем не указывать конкретные реализации классов (например, для тестов использовать заглушку MailServiceMock, в реальных условиях использовать настоящий класс MailServiceImpl) Нет необходимости самостоятельно управлять жизненным циклом объектов При замене модулей не нужно перекомпилировать приложение т.к. модули соединяются декларативно © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
- 14. 3. Inversion of Control Контейнеров может быть несколько Процедура создания контейнера зачастую занимает много времени – не рекомен-дуется создавать много контейнеров Обычно создаётся один контейнер для одного приложения © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
- 15. 4. Аспектно-ориентированное программирование Существует такая функциональность, которая не относится к каким-либо модулям системы Логирование Проверка прав доступа Вызов метода в рамках транзакции С помощью АОП мы можем подключаться в определённые места программы и вставлять нужный нам код © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
- 16. 4. Аспектно-ориентированное программирование Классы, которые описывают такой функционал, называются аспектами В Spring существует своя реализация АОП Она подходит для реализации задач средней сложности Для более сложных - разработчики Spring рекомендуют использовать библиотеку AspectJ © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
- 17. 5. Hello World! public interface Hello { public void sayHello(); } public class HelloImpl implements Hello { private String name; public void setName(String name) { this.name = name; } public void sayHello() { System.out.println(“Hello, ” + name); } } public class HelloWorld { public static void main(String args[]) { ApplicationContext context = new ClassPathApplicationContext(“spring-beans.xml”); Hello hello = (Hello) context.getBean(“hello”); hello.sayHello(); } } © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
- 18. 5. Hello World! <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=http://www.springframework.org/schema/beansxmlns:xsi=http://www.w3.org/2001/XMLSchema-instancexsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="hello" class=“package.HelloImpl"> <property name=“name" value=“Karl Gerdeler" /> </bean> </beans> © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
- 19. 5. Пример: Как великий князь в поход ходил Задача: Написать класс великого князя, который поведёт войско в поход на Польшу © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
- 20. 5. Пример: Как великий князь в поход ходил public class ВеликийКнязь{ private String имя; private ПоходНаПольшу поход; public ВеликийКнязь(String имя) { this.имя = имя; поход = new ПоходНаПольшу(); } public Богатство пойтиВПоход() throws НеПолучилосьException { return поход.сходить(); } } © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
- 21. 5. Пример: Как великий князь в поход ходил public class ПоходНаПольшу{ public ПоходНаПольшу() {} public Богатство пойтиВПоход() throws НеПолучилосьException { Богатство бг = null; побитьВсех(); бг = забратьБогатство(); return бг; } } © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
- 22. 5. Пример: Как великий князь в поход ходил public class КнязьTest { @Test public void тестПойтиВПоход() throws НеПолучилосьException{ ВеликийКнязь князь = new ВеликийКнязь(“Витовт”); Богатство бг = князь.пойтиВПоход(); AssertNotNull(бг); AssertTrue(бг.свободноКонвертируемое()); } } © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
- 25. Если при такой конфигурации написать тест для класса поход, то два теста будут тестировать одно и то же
- 27. Что делать, если мы хотим пойти в другой поход, например на Москву?Решение – создать интерфейс и использовать IoC В этом случае мы можем сделать поход загрушкой © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
- 28. 5. Пример: Как великий князь в поход ходил public interface Поход { public Богатство пойтиВПоход() throws НеПолучилосьException; } Public class ПоходНаПольшуimplements Поход { public Богатство пойтиВПоход() throws НеПолучилосьException { Богатство бг = null; // получение богатства return бг; } } public class ВеликийКнязь{ private String имя; private Поход поход; public ВеликийКнязь(String имя) { this.имя = имя; } public void setПоход(Поход поход) { this.поход = поход; } public Богатство пойтиВПоход() throws НеПолучилосьException { return поход.сходить(); } } © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
- 29. 5. Пример: Как великий князь в поход ходил <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=http://www.springframework.org/schema/beansxmlns:xsi=http://www.w3.org/2001/XMLSchema-instancexsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id=“quest“class=“package.ПоходНаПольшу"> </bean> <bean id=“prince" class=“package.ВеликийКнязь"> <constructor-argvalue=“Витовт" /> <property name=“поход" ref=“quest" /> </bean> </beans> © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
- 30. 5. Пример: Как великий князь в поход ходил public class ВеликийКнязьApp{ public static void main() throws НеПолучилосьException { ApplicationContext context = new ClassPathApplicationContext(“spring-beans.xml”); ВеликийКнязькнязь = (ВеликийКнязь) context.getBean(“prince”); князь.пойтиВПоход(); } } В реальных проектах князь может быть менеджером транзакций, сервисом удалённого взаимодействия, и т.д. © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam
- 31. Спасибо за внимание! Вопросы? © Belarus Open Source Laboratory, TechDayДокладчик: Константин Слисенко, JazzTeam