Konstantin slisenko - Spring Framework

1,357 views
1,258 views

Published on

Published in: Technology, Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,357
On SlideShare
0
From Embeds
0
Number of Embeds
65
Actions
Shares
0
Downloads
38
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Konstantin slisenko - Spring Framework

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

×