Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Aware- интерфейсы. Получение доступа к контектсу

Задание методов инициализации и деинициализации объекта

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

Пусть имеется класс:

public class ExampleBean { public void init() { // do some initialization work }}

Тогда, для того что бы указать Spring что необходимо вызвать метод с именем init(), необходимо в конфигурации бина указать:

<bean id="exampleInitBean" class="examples.ExampleBean" init-method="init"/>

 

А если необходимо сделать аналогичные действия для деинициализации:

public class ExampleBean { public void cleanup() { // do some destruction work (like releasing pooled connections) }}

И указать в конфигурации:

<bean id="exampleInitBean" class="examples.ExampleBean" destroy-method="cleanup"/>

 

При этом Spring предоставляет альтернативный способ добиться того же эффекта. Для этого можно реализовать интерфейсы org.springframework.beans.factory.DisposableBean и/или org.springframework.beans.factory.InitializingBean, которые задают соответственно методы

void destroy() throws Exception;

 

void afterPropertiesSet() throws Exception;

В этом случае отпадает необходимость задавать в файле конфигурации названия init/destroy методов в явном виде.

Тем не менее, такой подход имеет существенный недостаток, заключающийся в том, что код класса становится зависимым от Spring, а это нарушает концепцию слабой связанности (low-coupling) и non-intrusive подход, пропагандируемый Spring’ом.

 

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

Для этого Spring предоставляет серию Aware- интерфейсов. Одним из них является ApplicationContextAware:

 

public interface ApplicationContextAware { void setApplicationContext(ApplicationContext applicationContext) throws BeansException;}

 

Он вызывается контекстом автоматически в процессе создания экземпляра бина. В качестве аргумента передаётся ссылка на контекст. Эту ссылку бин может записать во внутреннее поле и использовать в дальнейшей работе.

 

Другой полезный интерфейс, который позволяет бину узнать его имя (id) под которым он сконфигурировать в контексте:

public interface BeanNameAware { void setBeanName(string name) throws BeansException;}

 

<== предыдущая лекция | следующая лекция ==>
Область видимости бина | Отложенная инициализация бинов
Поделиться с друзьями:


Дата добавления: 2014-01-05; Просмотров: 1253; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.