Upload
kslisenko
View
139
Download
2
Embed Size (px)
DESCRIPTION
Introduction to Spring framework with examples
Citation preview
Обзор возможностейInversion of Control
Аспектно-ориентированное программирование
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
План презентации
1. Общие сведения о Spring Framework2. Возможности Spring Framework3. Inversion of Control4. Аспектно-ориентированное
программирование5. Hello World! (java + Spring)6. Пример: Как великий князь в поход ходил
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
1. Общие сведения о Spring Framework
• Open Source• Упрощает разработку enterpise-приложений
(настройка, тестирование, …)• Может применяться для web, десктопных,
мобильных приложений. (Есть android версия)
• Платформы – Java, .Net (Spring.NET)• Предоставляет богатый набор
вспомогательных классов© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
1. Общие сведения о Spring Framework
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
Официальный сайт Spring Framework:springsource.org
1. Общие сведения о Spring Framework
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
2. Возможности Spring
• Инверсия контроля (IoC)• Аспектно-ориентированное программирование• Spring – это контейнер объектов, нет
необходимости писать в коде new, вместо этого запрашиваем объекты у него
• Spring – это фреймворк, который содержит библиотеки для web, orm, security, aop, ioc, mail, remoting – он предоставляет интерфейсы для абстрагирования от этих сервисов
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
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
3. Inversion of Control• В системе много объектов, которые
определённым образом между собой связаны (например, вызывают друг друга)
• Если мы указываем зависимости в коде:- трудно тестировать классы по отдельности- трудно подменять классы для разных конфигураций
• Мы можем выделить интерфейс и соединить объекты с помощью set-метода
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
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
3. Inversion of Control
• В любом случае мы должны установить зависимости в коде и указывать конкретные реализации классов
• Решение проблемы – переложить работу по установлению зависимостей на Spring
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
3. Inversion of Control
Spring – это контейнер, который:• Управляет жизненным циклом объектов• Позволяет настроить, как он будет их выдавать:
- синглетон- новый объект- пул объектов
• Позволяет настроить их автоматическое удаление• Позволяет задать зависимости между ними
(инжекция зависимостей)• Spring IoC – основной модуль Spring
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
3. Inversion of Control
Возможна инжекция зависимостей для любых типов:- коллекции (List, Map, Set, Properties)- пользовательские классы- примитивные и стандартные типы
Правила создания объектов и зависимостей между ними описываются в конфигураци-онном xml-файле
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
3. Inversion of Control
Преимущества:1. Мы можем не указывать конкретные реализации
классов (например, для тестов использовать заглушку MailServiceMock, в реальных условиях использовать настоящий класс MailServiceImpl)
2. Нет необходимости самостоятельно управлять жизненным циклом объектов
3. При замене модулей не нужно перекомпилировать приложение т.к. модули соединяются декларативно
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
3. Inversion of Control
• Контейнеров может быть несколько• Процедура создания контейнера зачастую
занимает много времени – не рекомен-дуется создавать много контейнеров
• Обычно создаётся один контейнер для одного приложения
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
4. Аспектно-ориентированное программирование
• Существует такая функциональность, которая не относится к каким-либо модулям системы– Логирование– Проверка прав доступа– Вызов метода в рамках транзакции
• С помощью АОП мы можем подключаться в определённые места программы и вставлять нужный нам код
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
4. Аспектно-ориентированное программирование
• Классы, которые описывают такой функционал, называются аспектами
• В Spring существует своя реализация АОП• Она подходит для реализации задач
средней сложности• Для более сложных - разработчики Spring
рекомендуют использовать библиотеку AspectJ
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
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
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
5. Пример: Как великий князь в поход ходил
Задача: Написать класс великого князя, который поведёт войско в поход на Польшу
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
5. Пример: Как великий князь в поход ходилpublic class ВеликийКнязь {
private String имя;private ПоходНаПольшу поход;
public ВеликийКнязь(String имя) {this.имя = имя;поход = new ПоходНаПольшу();
}
public Богатство пойтиВПоход() throws НеПолучилосьException {return поход.сходить();
}}
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
5. Пример: Как великий князь в поход ходилpublic class ПоходНаПольшу {
public ПоходНаПольшу() {}
public Богатство пойтиВПоход() throws НеПолучилосьException {Богатство бг = null;побитьВсех();бг = забратьБогатство();return бг;
}}
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
5. Пример: Как великий князь в поход ходилpublic class КнязьTest {
@Testpublic void тестПойтиВПоход() throws НеПолучилосьException {
ВеликийКнязь князь = new ВеликийКнязь(“Витовт”);Богатство бг = князь.пойтиВПоход();AssertNotNull(бг);AssertTrue(бг.свободноКонвертируемое());
}}
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
5. Пример: Как великий князь в поход ходил• Нужно протестировать князя• При этом незаметно тестируется класс ПоходНаПольшу• Если при такой конфигурации написать тест для класса
поход, то два теста будут тестировать одно и то же
• В классе поход может быть ошибка• Что делать, если мы хотим пойти в другой поход, например
на Москву?
Решение – создать интерфейс и использовать IoC В этом случае мы можем сделать поход загрушкой
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam
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
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
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
Спасибо за внимание!
Вопросы?
© Belarus Open Source Laboratory, TechDay Докладчик: Константин Слисенко, JazzTeam