27
Обзор возможностей Inversion of Control Аспектно-ориентированное программирование © Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam

Spring framework

Embed Size (px)

DESCRIPTION

Introduction to Spring framework with examples

Citation preview

Page 1: Spring framework

Обзор возможностейInversion of Control

Аспектно-ориентированное программирование

© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam

Page 2: Spring framework

План презентации

1. Общие сведения о Spring Framework2. Возможности Spring Framework3. Inversion of Control4. Аспектно-ориентированное

программирование5. Hello World! (java + Spring)6. Пример: Как великий князь в поход ходил

© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam

Page 3: Spring framework

1. Общие сведения о Spring Framework

• Open Source• Упрощает разработку enterpise-приложений

(настройка, тестирование, …)• Может применяться для web, десктопных,

мобильных приложений. (Есть android версия)

• Платформы – Java, .Net (Spring.NET)• Предоставляет богатый набор

вспомогательных классов© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam

Page 4: Spring framework

1. Общие сведения о Spring Framework

© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam

Официальный сайт Spring Framework:springsource.org

Page 5: Spring framework

1. Общие сведения о Spring Framework

© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam

Page 6: Spring framework

2. Возможности Spring

• Инверсия контроля (IoC)• Аспектно-ориентированное программирование• Spring – это контейнер объектов, нет

необходимости писать в коде new, вместо этого запрашиваем объекты у него

• Spring – это фреймворк, который содержит библиотеки для web, orm, security, aop, ioc, mail, remoting – он предоставляет интерфейсы для абстрагирования от этих сервисов

© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam

Page 7: Spring framework

3. Inversion of Controlpublic 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(“[email protected]”, “[email protected]”, “Заказ принят”);

}}

© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam

Page 8: Spring framework

3. Inversion of Control• В системе много объектов, которые

определённым образом между собой связаны (например, вызывают друг друга)

• Если мы указываем зависимости в коде:- трудно тестировать классы по отдельности- трудно подменять классы для разных конфигураций

• Мы можем выделить интерфейс и соединить объекты с помощью set-метода

© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam

Page 9: Spring framework

3. Inversion of Controlpublic 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(“[email protected]”, “[email protected]”, “Заказ принят”);

}}

© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam

Page 10: Spring framework

3. Inversion of Control

• В любом случае мы должны установить зависимости в коде и указывать конкретные реализации классов

• Решение проблемы – переложить работу по установлению зависимостей на Spring

© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam

Page 11: Spring framework

3. Inversion of Control

Spring – это контейнер, который:• Управляет жизненным циклом объектов• Позволяет настроить, как он будет их выдавать:

- синглетон- новый объект- пул объектов

• Позволяет настроить их автоматическое удаление• Позволяет задать зависимости между ними

(инжекция зависимостей)• Spring IoC – основной модуль Spring

© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam

Page 12: Spring framework

3. Inversion of Control

Возможна инжекция зависимостей для любых типов:- коллекции (List, Map, Set, Properties)- пользовательские классы- примитивные и стандартные типы

Правила создания объектов и зависимостей между ними описываются в конфигураци-онном xml-файле

© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam

Page 13: Spring framework

3. Inversion of Control

Преимущества:1. Мы можем не указывать конкретные реализации

классов (например, для тестов использовать заглушку MailServiceMock, в реальных условиях использовать настоящий класс MailServiceImpl)

2. Нет необходимости самостоятельно управлять жизненным циклом объектов

3. При замене модулей не нужно перекомпилировать приложение т.к. модули соединяются декларативно

© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam

Page 14: Spring framework

3. Inversion of Control

• Контейнеров может быть несколько• Процедура создания контейнера зачастую

занимает много времени – не рекомен-дуется создавать много контейнеров

• Обычно создаётся один контейнер для одного приложения

© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam

Page 15: Spring framework

4. Аспектно-ориентированное программирование

• Существует такая функциональность, которая не относится к каким-либо модулям системы– Логирование– Проверка прав доступа– Вызов метода в рамках транзакции

• С помощью АОП мы можем подключаться в определённые места программы и вставлять нужный нам код

© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam

Page 16: Spring framework

4. Аспектно-ориентированное программирование

• Классы, которые описывают такой функционал, называются аспектами

• В Spring существует своя реализация АОП• Она подходит для реализации задач

средней сложности• Для более сложных - разработчики Spring

рекомендуют использовать библиотеку AspectJ

© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam

Page 17: Spring framework

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

Page 18: Spring framework

5. Hello World!

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns=http://www.springframework.org/schema/beans xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi: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

Page 19: Spring framework

5. Пример: Как великий князь в поход ходил

Задача: Написать класс великого князя, который поведёт войско в поход на Польшу

© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam

Page 20: Spring framework

5. Пример: Как великий князь в поход ходилpublic class ВеликийКнязь {

private String имя;private ПоходНаПольшу поход;

public ВеликийКнязь(String имя) {this.имя = имя;поход = new ПоходНаПольшу();

}

public Богатство пойтиВПоход() throws НеПолучилосьException {return поход.сходить();

}}

© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam

Page 21: Spring framework

5. Пример: Как великий князь в поход ходилpublic class ПоходНаПольшу {

public ПоходНаПольшу() {}

public Богатство пойтиВПоход() throws НеПолучилосьException {Богатство бг = null;побитьВсех();бг = забратьБогатство();return бг;

}}

© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam

Page 22: Spring framework

5. Пример: Как великий князь в поход ходилpublic class КнязьTest {

@Testpublic void тестПойтиВПоход() throws НеПолучилосьException {

ВеликийКнязь князь = new ВеликийКнязь(“Витовт”);Богатство бг = князь.пойтиВПоход();AssertNotNull(бг);AssertTrue(бг.свободноКонвертируемое());

}}

© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam

Page 23: Spring framework

5. Пример: Как великий князь в поход ходил• Нужно протестировать князя• При этом незаметно тестируется класс ПоходНаПольшу• Если при такой конфигурации написать тест для класса

поход, то два теста будут тестировать одно и то же

• В классе поход может быть ошибка• Что делать, если мы хотим пойти в другой поход, например

на Москву?

Решение – создать интерфейс и использовать IoC В этом случае мы можем сделать поход загрушкой

© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam

Page 24: Spring framework

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

Page 25: Spring framework

5. Пример: Как великий князь в поход ходил<?xml version="1.0" encoding="UTF-8"?><beans xmlns=http://www.springframework.org/schema/beans xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi: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-arg value=“Витовт" /><property name=“поход" ref=“quest" />

</bean>

</beans>

© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam

Page 26: Spring framework

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

Page 27: Spring framework

Спасибо за внимание!

Вопросы?

© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam