Что такое findslide.org?

FindSlide.org - это сайт презентаций, докладов, шаблонов в формате PowerPoint.


Для правообладателей

Обратная связь

Email: Нажмите что бы посмотреть 

Яндекс.Метрика

Презентация на тему Spring Framework. Связи между объектами

Содержание

Spring Framework :: Связи между объектамиТрадиционный подходPersonCompanyclass Person { public String name; public Company company; public Person() { name = “Иван Иванов”; Company company = new Company(); company.name = “Luxoft”; }}class Company { public String name;}
Evgeniy KrivosheevAndrey StukalenkoVyacheslav YakovenkoVladimir SonkinLast update: Feb, 2013Spring FrameworkModule 2 – Components Model (IoC, DI) Spring Framework :: Связи между объектамиТрадиционный подходPersonCompanyclass Person {	public String name;	public Company Проблемы:Класс А напрямую зависит от класса В;Невозможно тестировать А в отрыве от Подход с использованием паттерна SingletonIvanovPersonLuxoftCompanyclass IvanovPerson extends Person {	public Person ivanovPerson = Подход с использованием паттерна SingletonIvanovPersonLuxoftCompanyОтдельный класс специально под нашу задачуВ коде IvanovPerson.create() PersonCompanyПодход с использованием IoC PersonCompanyПодход с использованием IoCПреимущества:контейнер создает необходимые объекты и управляет их временем жизниPerson Spring Framework :: Связи между объектамиABABРепозиторий JNDIИмя B_NAMEдля поиска BРегистрация в JNDI Инверсия управления (Inversion of Control, IoC) — принцип объектно-ориентированного программирования, используемый для Spring Framework :: IoC / DIПреимущества IoC контейнеров:Управление зависимостями и применение изменений Spring Framework :: Семейство IoC контейнеровBeanFactory – базовый интерфейс, представляющий IoC контейнер Spring Framework :: Семейство IoC контейнеровСуществует несколько реализаций ApplicationContext, доступных для использования. Spring Framework :: Работа с IoC контейнеромВ общем виде, работа IoC контейнера Spring Framework :: Работа с IoC контейнеромСоздание контейнера:public void main() {		ApplicationContext context Spring Framework :: Работа с IoC контейнеромПример конфигурации: Spring Framework :: Создание BeanПри помощи конструктора: Spring Framework :: Отложенная инициализацияДля конкретного бина:			…	Если singleton - бин зависит от Упражнения№3: “Hello, World” пример для Spring Framework:20 мин – самостоятельная работа;10 мин – обсуждение; Spring Framework Spring Framework :: Подключение property-файлов к xml-контексту					jdbc.driverClassName=org.hsqldb.jdbcDriverjdbc.url=jdbc:hsqldb:hsql://production:9002jdbc.username=sajdbc.password=rootjdbc.properties: Spring Framework :: Создание псевдонимов	После такой инструкции бин с именем originalName будет Spring Framework :: DIВнедрение зависимости через конструкторpublic class ConstructorInjection {	private Dependency dep;	private Spring Framework :: Constructor DIЦиклическая зависимость:При Constructor DI для этих классов – Spring Framework :: Setter DIpublic class SetterInjection {	private Dependency dep;	private String descr;	public Spring Framework :: AutowiringПример: сервисный класс для получения информации о пользователяхUserDirectoryLDAPUserDirectoryDatabaseUserDirectoryMockUserDirectoryclass LoginManager Spring Framework :: AutowiringТеперь включим автоматическое связывание (autowire) Spring Framework :: AutowiringSpring может автоматически связывать (добавлять зависимости) между бинами вместо Spring Framework :: AutowiringТипы автоматического связывания:no – запрет на автосвязывание – значение Spring Framework :: Использование аннотацийКонтейнер Spring также может быть сконфигурирован с использованием Spring Framework :: Использование аннотаций@RequiredПрименяется только к SET методам бинов;Определяет что соответствующее Spring Framework :: Использование аннотаций@AutowiredПрименяется к:SET методам бинов;Конструкторам;Методам с несколькими параметрами;Свойствам (в Spring Framework :: Использование аннотаций@Resourcepublic class SimpleMovieLister {	private MovieFinder movieFinder;	@Resource(name= Spring Framework :: Использование аннотаций@ComponentИспользуется для задания Spring компонент без использования XML Пример использования компонентов:package com.luxoft.calculator;@Service( Spring Framework :: scope биновSingletonПо-умолчаниюОдин экземпляр бина в контейнере Spring Framework :: scope биновPrototypeКаждый раз при внедрении в другой бин или Spring Framework :: Жизненный цикл бина Spring Framework :: Жизненный цикл бинаУправление бином, реализуя интерфейсы из SpringСозданиеРеализовать интерфейс Spring Framework :: Жизненный цикл бинаУправление бином без зависимости от Spring в Spring Framework :: Доступ к ApplicationContextЧтобы получить доступ к контексту (например, для Spring Framework :: СобытияПолучение стандартных событий:public class MyBean implements ApplicationListener {	public void Spring Framework :: СобытияОбработка событий внутри ApplicationContext обеспечивается при помощиКласса ApplicationEventИнтерфейса ApplicationListenerПри Spring Framework :: СобытияПример: регистрация нового сотрудника в компании.Возможные получатели события:  - оповещение Spring Framework :: ЛокализацияИнтерфейс ApplicationContext наследует интерфейс MessageSource и, соответственно, предоставляет функциональность Spring Framework :: Локализацияmessages_en_US.propertiescustomer.name=Ivan Ivanov, age : {0}, URL : {1}messages_ru_RU.propertiescustomer.name=Иван Иванов, Spring Framework :: Локализацияmessages_en_US.propertiescustomer.name=Ivan Ivanov, age : {0}, URL : {1}messages_ru_RU.propertiescustomer.name=Иван Иванов, public class CustomerService implements MessageSourceAware {	private MessageSource messageSource; 	public void setMessageSource(MessageSource messageSource) Spring Framework :: Инициализция коллекцийpublic class Customer {	private List lists;	private Set sets;	private 1 public class Customer {	private List lists;	private Set sets;	private Map maps;	private Properties pros; admin@nospam.com				support@nospam.com					Spring Framework :: Инициализция коллекцийpublic class Customer {	private List lists;	private Set sets;	private УпражненияРабота со схемой Spring IoC 20 мин – самостоятельная работа; 10 мин – обсуждение; Spring Framework :: Наследование свойств administrator@example.com				support@example.com																			sales@example.com				support@example.co.uk						 child.adminEmails=Применимо к properties, list, set, map.administrator=administrator@example.comsales=sales@example.comsupport=support@example.co.ukSpring Framework :: Объединение коллекций Spring Framework :: Пустые и null значения Spring Framework :: p-namespace Spring Framework :: Профили конфигурации																GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();ctx.getEnvironment().setActiveProfiles( Spring Framework :: Java-based конфигурация@Configuration@Profile(“dev”)public class TransferServiceConfig {	@Autowired DataSource dataSource;	@Bean	public TransferService transferService() Упражнения№4: Разработка простейшего приложения:50 мин – самостоятельная работа;10 мин – обсуждение; Вопросы!?
Слайды презентации

Слайд 2 Spring Framework :: Связи между объектами
Традиционный подход
Person
Company
class Person

Spring Framework :: Связи между объектамиТрадиционный подходPersonCompanyclass Person {	public String name;	public

{
public String name;
public Company company;

public Person() {
name = “Иван

Иванов”;
Company company = new Company();
company.name = “Luxoft”;
}
}

class Company {
public String name;
}

Слайд 3 Проблемы:
Класс А напрямую зависит от класса В;
Невозможно тестировать

Проблемы:Класс А напрямую зависит от класса В;Невозможно тестировать А в отрыве

А в отрыве от В (если для В нужна

база – для тестирования А она также понадобится);
Временем жизни объекта В управляет А – нельзя использовать тот же объект в других местах;
Нельзя «подменить» В на другую реализацию;

A

B

Традиционный подход

Spring Framework :: Связи между объектами


Слайд 4 Подход с использованием паттерна Singleton
IvanovPerson
LuxoftCompany
class IvanovPerson extends Person

Подход с использованием паттерна SingletonIvanovPersonLuxoftCompanyclass IvanovPerson extends Person {	public Person ivanovPerson

{
public Person ivanovPerson = new Person();
public static Person create()

{
ivanovPerson.name = “Иван Иванов”;
ivanovPerson.company = LuxoftCompany.create();
return ivanovPerson;
}
}
class LuxoftCompany extends Company {
public Company luxoftCompany = new Company();
public LuxoftCompany() {
luxoftCompany = “Luxoft”;
}
public static Company create() {
return luxoftCompany;
}
}

class Person {
public String name;
public Company company;
}

class Company {
public String name;
}

Spring Framework :: Связи между объектами


Слайд 5 Подход с использованием паттерна Singleton
IvanovPerson
LuxoftCompany
Отдельный класс специально под

Подход с использованием паттерна SingletonIvanovPersonLuxoftCompanyОтдельный класс специально под нашу задачуВ коде

нашу задачу
В коде IvanovPerson.create() стоит прямая ссылка на этот

класс
В случае перевода Иванова в другую компанию, надо менять этот код
Для тестирования невозможно «на время» подменить компанию

Spring Framework :: Связи между объектами


Слайд 6 Person
Company
Подход с использованием IoC


PersonCompanyПодход с использованием IoC  	    POJO –


id=“luxoftCompany" class=“Company">







ref=“companyReport"/>

POJO – plain old Java Object

application-context.xml

class Person {
public String name;
public Company company;
}

class Company {
public String name;
}

class BankApplication {
@Autowired
@Required
private CR companyReport;
public void setCompanyReport() ;


Spring Framework :: Связи между объектами


Слайд 7 Person
Company
Подход с использованием IoC
Преимущества:
контейнер создает необходимые объекты и

PersonCompanyПодход с использованием IoCПреимущества:контейнер создает необходимые объекты и управляет их временем

управляет их временем жизни

Person и Company не связаны друг

с другом и независимы от внешних библиотек

application-context документирует систему и связи между объектами

легкость внесения изменений в связи системы

Spring Framework :: Связи между объектами


Слайд 8 Spring Framework :: Связи между объектами
A
B
A
B
Репозиторий JNDI
Имя B_NAME
для

Spring Framework :: Связи между объектамиABABРепозиторий JNDIИмя B_NAMEдля поиска BРегистрация в

поиска B
Регистрация в JNDI
под именем B_NAME
Традиционный подход: связи

между объектами внутри кода

Паттерн Service Locator (JNDI в JEE): объекты в репозитории

IoC: объекты ничего не знают друг о друге

A

B

Application context

- cоздает объект A
- инициализирует


- cоздает объект A
- инициализирует,
сообщая о B

class A {
private B b;
}

class B {
}


Слайд 9 Инверсия управления (Inversion of Control, IoC) — принцип

Инверсия управления (Inversion of Control, IoC) — принцип объектно-ориентированного программирования, используемый

объектно-ориентированного программирования, используемый для уменьшения связанности объектов.
Модули верхнего уровня

не должны зависеть от модулей нижнего уровня. Оба должны зависеть от абстракции.
Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.

Spring Framework :: IoC

Техники реализации:

Фабричный метод (англ. Factory pattern)
Service locator (англ. Service locator pattern)
Внедрение зависимости (англ. Dependency injection)
Через метод класса (англ. Setter injection)
Через конструктор (англ. Constructor injection)
Через интерфейс внедрения (англ. Interface injection)
IoC контейнер (англ. IoC-container)


Слайд 10 Spring Framework :: IoC / DI
Преимущества IoC контейнеров:
Управление

Spring Framework :: IoC / DIПреимущества IoC контейнеров:Управление зависимостями и применение

зависимостями и применение изменений без перекомпиляции;
Упрощение повторного использования классов

или компонентов;
Упрощение unit-тестирования;
Более "чистый" код (классы не инициализируют вспомогательные объекты);
В IoC контейнер лучше всего выносить те интерфейсы, реализация которых может быть изменена в текущем проекте или в будущих проектах.


Слайд 11 Spring Framework :: Семейство IoC контейнеров
BeanFactory – базовый

Spring Framework :: Семейство IoC контейнеровBeanFactory – базовый интерфейс, представляющий IoC

интерфейс, представляющий IoC контейнер в Spring Framework (используемая реализация:

XmlBeanFactory):
BeanFactory предоставляет только базовую низкоуровневую функциональность.
ApplicationContext – интерфейс, расширяющий BeanFactory и добавляющий различную функциональность к базовым возможностям контейнера:
простота интеграции со Spring AOP;
работа с ресурсами и сообщениями;
обработка событий;
поддержка интернационализации;
Специфические контексты приложений (как, например, WebApplicationContext);



Слайд 12 Spring Framework :: Семейство IoC контейнеров
Существует несколько реализаций

Spring Framework :: Семейство IoC контейнеровСуществует несколько реализаций ApplicationContext, доступных для

ApplicationContext, доступных для использования. Основными являются:
GenericXmlApplicationContext (since v.3.0);
ClassPathXmlApplicationContext;
FileSystemXmlApplicationContext;
WebApplicationContext;
XML является

традиционным способом задания конфигурации контейнера, хотя существуют и другие способы задания метаданных (аннотации, Java код и т.д.);
Во многих случаях проще и быстрее конфигурировать контейнер с помощью аннотаций. Но надо помнить, что аннотированные конфигурации содержат некоторые ограничения и вносят дополнительные зависимости на уровене кода;
В большинстве случаев пользователю (разработчику) не придется самому инициализировать Spring IoC контейнер;

Слайд 13 Spring Framework :: Работа с IoC контейнером
В общем

Spring Framework :: Работа с IoC контейнеромВ общем виде, работа IoC

виде, работа IoC контейнера Spring может быть представлена в

виде следующей диаграммы:









В процессе создания и инициализации контейнера классы вашего приложения объединяются с метаданными (конфигурацией контейнера) и на выходе вы получаете полностью сконфигурированное и готовое к работе приложение.

Слайд 14 Spring Framework :: Работа с IoC контейнером
Создание контейнера:
public

Spring Framework :: Работа с IoC контейнеромСоздание контейнера:public void main() {		ApplicationContext

void main() {
ApplicationContext context =
new ClassPathXmlApplicationContext(”application-context.xml");

BankApplication bankApplication =
context.getBean(“bankApplication”);
}

ApplicationContext context =
new ClassPathXmlApplicationContext(
new String[] {"services.xml", "daos.xml"});


Слайд 15 Spring Framework :: Работа с IoC контейнером
Пример конфигурации:

Spring Framework :: Работа с IoC контейнеромПример конфигурации:

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

xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">













Слайд 16 Spring Framework :: Создание Bean
При помощи конструктора:

Spring Framework :: Создание BeanПри помощи конструктора:


class="ru.luxoft.training.samples.Example" />

При помощи статического фабричного метода:


factory-method="createInstance" />

При помощи не статического фабричного метода:

class="examples.DefaultServiceFactory" />

factory-bean="serviceLocator"
factory-method="createClientServiceInstance" />


Слайд 17 Spring Framework :: Отложенная инициализация
Для конкретного бина:

Spring Framework :: Отложенная инициализацияДля конкретного бина:			…	Если singleton - бин зависит

class=“ru.luxoft.training.ClientService"
lazy-init=“true" />

Для всех бинов в контейнере:

- бин зависит от lazy - бина, то lazy - бин создастся сразу, при создании singleton - бина.

Слайд 18 Упражнения
№3: “Hello, World” пример для Spring Framework:
20 мин

Упражнения№3: “Hello, World” пример для Spring Framework:20 мин – самостоятельная работа;10 мин – обсуждение;

– самостоятельная работа;
10 мин – обсуждение;


Слайд 19



Spring Framework :: Импорт контекстаЧасто удобно разбивать контекст на несколько файлов:




class="..."/>


Spring Framework :: Импорт контекста

Часто удобно разбивать контекст на несколько файлов:


Слайд 20 Spring Framework :: Подключение property-файлов к xml-контексту

Spring Framework :: Подключение property-файлов к xml-контексту					jdbc.driverClassName=org.hsqldb.jdbcDriverjdbc.url=jdbc:hsqldb:hsql://production:9002jdbc.username=sajdbc.password=rootjdbc.properties:

value="classpath:com/foo/jdbc.properties" />




/>



jdbc.driverClassName=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:hsql://production:9002
jdbc.username=sa
jdbc.password=root

jdbc.properties:


Слайд 21 Spring Framework :: Создание псевдонимов


После

Spring Framework :: Создание псевдонимов	После такой инструкции бин с именем originalName

такой инструкции бин с именем originalName будет также доступен

под именем aliasName;

Такая необходимость часто возникает, когда архитектура приложения изначально создана с учетом возможности расширения, но при этом пока в конкретных разделах такой необходимости не возникает (и, соответственно, нет смысла плодить дополнительные объекты).

Слайд 22 Spring Framework :: DI
Внедрение зависимости через конструктор
public class

Spring Framework :: DIВнедрение зависимости через конструкторpublic class ConstructorInjection {	private Dependency

ConstructorInjection {
private Dependency dep;
private String descr;

public ConstructorInjection(Dependency dep, String

descr) {
this.dep = dep;
this.descr = descr;
}
}








Слайд 23 Spring Framework :: Constructor DI
Циклическая зависимость:








При Constructor DI

Spring Framework :: Constructor DIЦиклическая зависимость:При Constructor DI для этих классов

для этих классов – BeanCurrentlyInCreationException

Решение – в одном или

обоих классах заменить Constructor DI на Setter DI

Слайд 24 Spring Framework :: Setter DI
public class SetterInjection {
private

Spring Framework :: Setter DIpublic class SetterInjection {	private Dependency dep;	private String

Dependency dep;
private String descr;

public void setDep(Dependency dep) {
this.dep =

dep;
}
public void setDescr(String descr) {
this.descr = descr;
}
}










Слайд 25 Spring Framework :: Autowiring
Пример: сервисный класс для получения

Spring Framework :: AutowiringПример: сервисный класс для получения информации о пользователяхUserDirectoryLDAPUserDirectoryDatabaseUserDirectoryMockUserDirectoryclass

информации о пользователях
UserDirectory
LDAPUserDirectory
DatabaseUserDirectory
MockUserDirectory

class LoginManager {
UserDirectory userDirectory;
}

class UserDirectorySearch {

UserDirectory userDirectory;
}

class UserInfo {
UserDirectory userDirectory;
}

Пусть есть классы, которым нужна информация о пользователях:






class=“UserDirectorySearch”>






Слайд 26 Spring Framework :: Autowiring
Теперь включим автоматическое связывание (autowire)

Spring Framework :: AutowiringТеперь включим автоматическое связывание (autowire)

id=“userDirectory” class=“LDAPUserDirectory” />







id=“userInfo“ class=“UserInfo“ autowire="byType“>

class LoginManager {
UserDirectory userDirectory;
}

class UserDirectorySearch {
UserDirectory userDirectory;
}

class UserInfo {
LDAPUserDirectory ldapUserDirectory;
}

Свойство userDirectory автоматически инициализируется:


Слайд 27 Spring Framework :: Autowiring
Spring может автоматически связывать (добавлять

Spring Framework :: AutowiringSpring может автоматически связывать (добавлять зависимости) между бинами

зависимости) между бинами вместо ;

В некоторых случаях это может

существенно сократить объем затрат на конфигурирование контейнера;
Позволяет автоматически обрабатывать изменения в связи с расширением объектной модели (например, при добавлении новых зависимостей они подключатся автоматически);
Связывание по типу может работать, когда доступен только один бин определенного типа;
Менее понятно для чтения и прослеживания зависимостей, чем явное задание зависимостей (магия!);

Задается с помощью атрибута autowire в определении бина



Слайд 28 Spring Framework :: Autowiring
Типы автоматического связывания:
no – запрет

Spring Framework :: AutowiringТипы автоматического связывания:no – запрет на автосвязывание –

на автосвязывание – значение по умолчанию;
byName – автосвязывание по

имени свойства. Контейнер будет искать бин с ID, совпадающим с именем свойства. Если такой бин не найден – объект остается несвязанным;
byType – автосвязывание по типу параметра. Работает только в случае наличия единственного экземпляра бина соответствующего класса в контейнере. Если более одного бина – UnsatisfiedDependencyException;
constructor – контейнер ищет бин (или бины) совпадающие по типу с параметрами конструктора. Если более одного бина одного типа или более одного конструктора – UnsatisfiedDependencyException;

Слайд 29 Spring Framework :: Использование аннотаций
Контейнер Spring также может

Spring Framework :: Использование аннотацийКонтейнер Spring также может быть сконфигурирован с

быть сконфигурирован с использованием аннотаций;

Основные типы поддерживаемых аннотаций:
@Required
@Autowired
@Component

Для поддержки

конфигурации через аннотации, в конфигурации Spring контейнера должно быть указано следующее свойство:



Слайд 30 Spring Framework :: Использование аннотаций
@Required
Применяется только к SET

Spring Framework :: Использование аннотаций@RequiredПрименяется только к SET методам бинов;Определяет что

методам бинов;
Определяет что соответствующее свойство бина должно быть вычислено

на этапе конфигурации (через конфигурацию или автоматическое связывание);
Если соответствующее свойство не может быть задано – контейнер сгенерирует соответствующее исключение, что позволит избежать «неожиданных» NullPointerException в процессе работы системы;

public class SimpleMovieLister {
private MovieFinder movieFinder;

@Required
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
}


Слайд 31 Spring Framework :: Использование аннотаций
@Autowired
Применяется к:
SET методам бинов;
Конструкторам;
Методам

Spring Framework :: Использование аннотаций@AutowiredПрименяется к:SET методам бинов;Конструкторам;Методам с несколькими параметрами;Свойствам

с несколькими параметрами;
Свойствам (в том числе, приватным);
К массивам и

типизированным коллекциям (будут привязаны ВСЕ бины соответствующего класса)

Возможно использование с @Qualifier(“name”) – в таком случае будет автоматически привязан бин с соответствующим ID;

По-умолчанию генерируется исключение если не найден ни один подходящий бин. Это поведение может быть изменено с помощью @Autowired(required=false);

Слайд 32 Spring Framework :: Использование аннотаций
@Resource

public class SimpleMovieLister {
private

Spring Framework :: Использование аннотаций@Resourcepublic class SimpleMovieLister {	private MovieFinder movieFinder;	@Resource(name=

MovieFinder movieFinder;

@Resource(name="myMovieFinder")
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
}


Слайд 33 Spring Framework :: Использование аннотаций
@Component

Используется для задания Spring

Spring Framework :: Использование аннотаций@ComponentИспользуется для задания Spring компонент без использования

компонент без использования XML конфигурации
Применяемся к классам
Является базовым стереотипом

для любого Spring-managed компонента
Рекомендуется использовать более точные стереотипы:
@Service
@Repository
@Controller
В большинстве случаев, если вы не уверены, какой именно стереотип использовать – используйте @Service
Для автоматической регистрации бинов через аннотации необходимо указать следующую инструкцию в конфигурации контейнера:






Слайд 34 Пример использования компонентов:

package com.luxoft.calculator;
@Service("adder")
public class Adder {

Пример использования компонентов:package com.luxoft.calculator;@Service(

public int add(int a, int b) {

return a + b;
}
}

package com.luxoft.calculator;
@Component("calculator")
public class Calculator {
@Autowired
private Adder adder;

public void makeAnOperation() {
int r1 = adder.add(1,2);
System.out.println("r1 = " + r1);
}

Spring Framework :: Использование аннотаций



application_context.xml:


Слайд 35 Spring Framework :: scope бинов
Singleton
По-умолчанию
Один экземпляр бина в

Spring Framework :: scope биновSingletonПо-умолчаниюОдин экземпляр бина в контейнере

контейнере


Слайд 36 Spring Framework :: scope бинов
Prototype
Каждый раз при внедрении

Spring Framework :: scope биновPrototypeКаждый раз при внедрении в другой бин

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

новый экземпляр бина



Слайд 37 Spring Framework :: Жизненный цикл бина

Spring Framework :: Жизненный цикл бина

Слайд 38 Spring Framework :: Жизненный цикл бина
Управление бином, реализуя

Spring Framework :: Жизненный цикл бинаУправление бином, реализуя интерфейсы из SpringСозданиеРеализовать

интерфейсы из Spring

Создание
Реализовать интерфейс InitializingBean
Переопределить метод afterPropertiesSet()

Удаление
Реализовать интерфейс

DisposableBean
Переопределить метод destroy()

Слайд 39 Spring Framework :: Жизненный цикл бина
Управление бином без

Spring Framework :: Жизненный цикл бинаУправление бином без зависимости от Spring

зависимости от Spring в коде

В нужный бин добавить методы

для инициализации и/или удаления и указать их в объявлении бина:

init-method=“init"
destroy-method=“cleanup” />

Можно задать методы для создания и/или удаления для всех бинов внутри контейнера:

default-destroy-method=“cleanup”>


Слайд 40 Spring Framework :: Доступ к ApplicationContext
Чтобы получить доступ

Spring Framework :: Доступ к ApplicationContextЧтобы получить доступ к контексту (например,

к контексту (например, для публикации своих событий) достаточно у

бина имплементировать интерфейс ApplicationContextAware

public class CommandManager implements ApplicationContextAware {

private ApplicationContext applicationContext;

public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.applicationContext = applicationContext;
}
}


Слайд 41 Spring Framework :: События
Получение стандартных событий:

public class MyBean

Spring Framework :: СобытияПолучение стандартных событий:public class MyBean implements ApplicationListener {	public

implements ApplicationListener {
public void onApplicationEvent(ApplicationEvent event) {

}
}

Публикация собственных событий:

public

class CustomEvent extends ApplicationEvent {
public CustomEvent (Object obj) {
super(obj);
}
}
context.publishEvent(new CustomEvent(new Object()));




Слайд 42 Spring Framework :: События
Обработка событий внутри ApplicationContext обеспечивается

Spring Framework :: СобытияОбработка событий внутри ApplicationContext обеспечивается при помощиКласса ApplicationEventИнтерфейса

при помощи
Класса ApplicationEvent
Интерфейса ApplicationListener

При наступлении события нотифицируются все бины,

зарегистрированные в контейнере и реализующие интерфейс ApplicationListener

ApplicationEvent – основные реализации:
ContextRefreshedEvents – создание или обновление ApplicationContext
Синглетоны созданы
ApplicationContext готов к использованию
ContextClosedEvent
после использования close() метода
RequestHandledEvent
только для веб приложения

Слайд 43 Spring Framework :: События
Пример: регистрация нового сотрудника в

Spring Framework :: СобытияПример: регистрация нового сотрудника в компании.Возможные получатели события:  -

компании.

Возможные получатели события:
  - оповещение охранников, чтобы сделали пропуск
  - охранники

подписываются на событие
  - дополнительно могут подписаться бухгалтерия, отдел кадров
  - допустим надо добавить новую функциональность:
регистрировать новых сотрудников в базе данных
- для этого нам достаточно создать класс для регистрации
и подписаться на событие добавления сотрудника

Преимущества:
Получателей может быть как угодно много;
Добавление получателя не добавляет зависимости: о получателе знает только он сам

Недостатки:
- Приводит к неявному поведению приложения

Слайд 44 Spring Framework :: Локализация
Интерфейс ApplicationContext наследует интерфейс MessageSource

Spring Framework :: ЛокализацияИнтерфейс ApplicationContext наследует интерфейс MessageSource и, соответственно, предоставляет

и, соответственно, предоставляет функциональность интернационализации (i18n)

При загрузке автоматически ищет

MessageSource бин в конфигурации (бин должен наследоваться от MessageSource и иметь id=“messageSource”)

Если такой бин не может быть найден нигде в контексте – ApplicationContext создает экземпляр «заглушки» - DelegatingMessageSource для корректной обработки соответствующих методов

Слайд 45 Spring Framework :: Локализация
messages_en_US.properties

customer.name=Ivan Ivanov, age : {0},

Spring Framework :: Локализацияmessages_en_US.propertiescustomer.name=Ivan Ivanov, age : {0}, URL : {1}messages_ru_RU.propertiescustomer.name=Иван

URL : {1}
messages_ru_RU.properties

customer.name=Иван Иванов, возраст : {0}, URL :

{1}

class="org.springframework.context.support.ResourceBundleMessageSource">

locale\customer\messages


Папка для расположения файлов:

resources\locale\customer\

Locale.xml:


Слайд 46 Spring Framework :: Локализация
messages_en_US.properties

customer.name=Ivan Ivanov, age : {0},

Spring Framework :: Локализацияmessages_en_US.propertiescustomer.name=Ivan Ivanov, age : {0}, URL : {1}messages_ru_RU.propertiescustomer.name=Иван

URL : {1}
messages_ru_RU.properties

customer.name=Иван Иванов, возраст : {0}, URL :

{1}

public static void main(String[] args) {
ApplicationContext context
= new ClassPathXmlApplicationContext("locale.xml");

String name = context.getMessage("customer.name",
new Object[] { 28, "http://www.luxoft.com" }, Locale.US);

System.out.println("Customer name (English) : " + name);

String nameRussian = context.getMessage("customer.name",
new Object[] {28, "http://www.luxoft.com" }, Locale.RU);

System.out.println("Customer name (Russian) : " + nameRussian);
}


Слайд 47 public class CustomerService implements MessageSourceAware {
private MessageSource messageSource;

public class CustomerService implements MessageSourceAware {	private MessageSource messageSource; 	public void setMessageSource(MessageSource


public void setMessageSource(MessageSource messageSource) {
this.messageSource = messageSource;
}

public void printMessage(){
ApplicationContext

context
= new ClassPathXmlApplicationContext("locale.xml");

String name = context.getMessage("customer.name",
new Object[] { 28, "http://www.luxoft.com" }, Locale.US);

System.out.println("Customer name (English) : " + name);

String nameRussian = context.getMessage("customer.name",
new Object[] {28, "http://www.luxoft.com" }, Locale.RU);

System.out.println("Customer name (Russian) : " + nameRussian);
}
}

Spring Framework :: Локализация


Слайд 48 Spring Framework :: Инициализция коллекций
public class Customer {
private

Spring Framework :: Инициализция коллекцийpublic class Customer {	private List lists;	private Set

List lists;
private Set sets;
private Map maps;
private Properties pros;

}






1










Слайд 49


1


1

value=“Ivan" />





public class

Customer {
private List lists;
private Set sets;
private Map maps;
private Properties pros;
}

Spring Framework :: Инициализция коллекций



Слайд 50



public class Customer {	private List lists;	private Set sets;	private Map maps;	private Properties

key="Key 2" value-ref="PersonBean" />


/>






public class Customer {
private List lists;
private Set sets;
private Map maps;
private Properties pros;
}

Spring Framework :: Инициализция коллекций



Слайд 51


admin@nospam.com
support@nospam.com


Spring Framework ::

admin@nospam.com				support@nospam.com					Spring Framework :: Инициализция коллекцийpublic class Customer {	private List lists;	private Set

Инициализция коллекций
public class Customer {
private List lists;
private Set sets;
private

Map maps;
private Properties pros;
}



Слайд 52 Упражнения
Работа со схемой Spring IoC
20 мин –

УпражненияРабота со схемой Spring IoC 20 мин – самостоятельная работа; 10 мин – обсуждение;

самостоятельная работа;
10 мин – обсуждение;


Слайд 53


Spring Framework :: Наследование свойств

/>






property value of 1 will be inherited from parent -->



Spring Framework :: Наследование свойств


Слайд 54



administrator@example.com
support@example.com



administrator@example.com				support@example.com																			sales@example.com				support@example.co.uk						 child.adminEmails=Применимо к properties, list, set, map.administrator=administrator@example.comsales=sales@example.comsupport=support@example.co.ukSpring Framework :: Объединение коллекций

parent="parent">

collection definition -->

sales@example.com
support@example.co.uk





child.adminEmails=

Применимо к properties, list, set, map.

administrator=administrator@example.com
sales=sales@example.com
support=support@example.co.uk

Spring Framework :: Объединение коллекций


Слайд 55






Spring

Spring Framework :: Пустые и null значения

Framework :: Пустые и null значения


Слайд 56





Spring Framework :: p-namespace

class="com.example.ExampleBean"
p:email="foo@bar.com" />



name="spouse" ref="jane" />


p:name="John Doe"
p:spouse-ref="jane" />





Spring Framework :: p-namespace


Слайд 57 Spring Framework :: Профили конфигурации


Spring Framework :: Профили конфигурации																GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();ctx.getEnvironment().setActiveProfiles(

/>







GenericXmlApplicationContext ctx =

new GenericXmlApplicationContext();
ctx.getEnvironment().setActiveProfiles("dev");
ctx.load("classpath:/com/bank/config/xml/*-config.xml");
ctx.refresh();

Указание профиля и загрузка конфигурации в Java-коде:

-Dspring.profiles.active="profile1,profile2"

Указание профиля в параметрах командной строки:


Слайд 58 Spring Framework :: Java-based конфигурация
@Configuration
@Profile(“dev”)
public class TransferServiceConfig {
@Autowired

Spring Framework :: Java-based конфигурация@Configuration@Profile(“dev”)public class TransferServiceConfig {	@Autowired DataSource dataSource;	@Bean	public TransferService

DataSource dataSource;
@Bean
public TransferService transferService() {
return new DefaultTransferService(accountRepository(), feePolicy());
}
@Bean
public AccountRepository

accountRepository() {
return new JdbcAccountRepository(dataSource);
}
@Bean
public FeePolicy feePolicy() {
return new ZeroFeePolicy();
}
}

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.getEnvironment().setActiveProfiles("dev");
// find and register all @Configuration classes within
ctx.scan("com.bank.config.code");
ctx.refresh();


Слайд 59 Упражнения
№4: Разработка простейшего приложения:
50 мин – самостоятельная работа;
10

Упражнения№4: Разработка простейшего приложения:50 мин – самостоятельная работа;10 мин – обсуждение;

мин – обсуждение;


  • Имя файла: spring-framework-svyazi-mezhdu-obektami.pptx
  • Количество просмотров: 109
  • Количество скачиваний: 0