Измените мое сердце на свое сердце и глубоко помните друг друга.
Обзор
В этой главе мы узнаемSpring beanжизненный цикл. владелецbeanРазличные фазы жизненного цикла, методы обратного вызова инициализации и уничтожения. мы научимся использоватьXMLнастроить и аннотировать конфигурацию для управленияbeanСобытия жизненного цикла.
Цикл объявления бина
Когда контейнер запускается -- должен основываться наJavaилиXML beanопределить инстанцированиеSpring bean. Есть также некоторые шаги после инициализации, которые необходимо выполнить, чтобы привести его в пригодное для использования состояние.Spring BootЗапуск приложения тоже самоеbeanЖизненный цикл.
После этого, когдаbean, он будет изменен сIoCудалены из контейнера.
Spring bean factoryОтвечает за управление черезSpringконтейнер созданbeanжизненный цикл.
обратный вызов жизненного цикла
Spring bean factoryконтрольbeanсозидание и разрушение. Для выполнения некоторых пользовательских операций он предоставляет методы обратного вызова, которые можно условно разделить на две категории:
-
Post-initializationметод обратного вызова -
Pre-destructionметод обратного вызова
Диаграмма жизненного цикла
Методы обратного вызова жизненного цикла
SpringФреймворк предоставляет следующие 4 метода управленияBeanСобытия жизненного цикла:
-
InitializingBeanа такжеDisposableBeanинтерфейс обратного вызова -
*AwareИнтерфейс предоставляет некоторые специальные реализации -
BeanНастройка в конфигурационном файлеinit()а такжеdestroy()метод -
@PostConstructа также@PreDestroyаннотация
InitializingBeanа такжеDisposableBeanинтерфейс
org.springframework.beans.factory.InitializingBeanинтерфейс позволяетbeanустановить в контейнерbeanРабота по инициализации выполняется после всех необходимых свойств файла .
InitializingBeanИнтерфейс определяет метод:
void afterPropertiesSet() throws Exception;
это не инициализацияbeanпредпочтительный метод, потому что онbeanкласс сspringКонтейнеры плотно соединены между собой. Лучший способ -applicationContext.xmlдокументbeanиспользуется в определенииinit-methodАтрибуты.
Точно так же реализоватьorg.springframework.beans.factory.DisposableBeanинтерфейс позволяетBeanПолучите обратный вызов, когда контейнер, содержащий его, будет уничтожен.
DisposableBeanИнтерфейс определяет метод:
void destroy() throws Exception;
// 实现上述接口的示例bean:
package cn.howtodoinjava.task;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
public class DemoBean implements InitializingBean, DisposableBean
{
//Other bean attributes and methods
@Override
public void afterPropertiesSet() throws Exception
{
//Bean initialization code
}
@Override
public void destroy() throws Exception
{
//Bean destruction code
}
}
*Awareинтерфейс
Springпредоставляет ряд*Awareинтерфейс, позволяющийbeanУкажите контейнерам, что им нужна какая-то зависимость от инфраструктуры. Каждый интерфейс требует, чтобы вы реализовали метод для внедрения зависимостей.bean.
Эти интерфейсы можно обобщить следующим образом:
*Awareинтерфейс |
Метод переопределения | Цель |
|---|---|---|
ApplicationContextAware |
void setApplicationContext (ApplicationContext applicationContext) throws BeansException; |
Интерфейс будет использоваться любым желающим запустить егоApplicationContextУведомить объект, к которому он применяется. |
ApplicationEventPublisherAware |
void setApplicationEventPublisher (ApplicationEventPublisher applicationEventPublisher); |
установить этот объект для запускаApplicationEventPublisher. |
BeanClassLoaderAware |
void setBeanClassLoader (ClassLoader classLoader); |
БудуbeanЗагрузчик классов предоставляетbeanобратный вызов экземпляра. |
BeanFactoryAware |
void setBeanFactory (BeanFactory beanFactory) throws BeansException; |
Отдайте собственные заводыBeanобратный вызов экземпляра. |
BeanNameAware |
void setBeanFactory (BeanFactory beanFactory) throws BeansException; |
при создании этогоbeanизbeanзаводская установкаbeanИмя. |
BootstrapContextAware |
void setBootstrapContext (BootstrapContext bootstrapContext); |
Установите объект, в котором нужно запуститьBootstrapContext. |
LoadTimeWeaverAware |
void setLoadTimeWeaver (LoadTimeWeaver loadTimeWeaver); |
Установите этот объект, чтобы он содержалApplicationContextизLoadTimeWeaver. |
MessageSourceAware |
void setMessageSource (MessageSource messageSource); |
Устанавливает объект, в котором работает этот объектMessageSource. |
NotificationPublisherAware |
void setNotificationPublisher (NotificationPublisher notificationPublisher); |
Установить для текущего экземпляра управляемого ресурсаNotificationPublisherпример. |
PortletConfigAware |
void setPortletConfig (PortletConfig portletConfig); |
Объект, установленный для запускаPortletConfig. |
PortletContextAware |
void setPortletContext (PortletContext portletContext); |
Устанавливает объект, в котором работает этот объектPortletContext. |
ResourceLoaderAware |
void setResourceLoader (ResourceLoader resourceLoader); |
Устанавливает объект, в котором работает этот объектResourceLoader. |
ServletConfigAware |
void setServletConfig (ServletConfig servletConfig); |
Устанавливает запущенный объектServletConfig. |
ServletContextAware |
void setServletContext (ServletContext servletContext); |
Устанавливает запущенный объектServletContext. |
последующийJavaБлок кода показывает использование*Awareинтерфейс для управленияbeanИспользование жизненного цикла.
package cn.howtodoinjava.task;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanClassLoaderAware;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.context.MessageSource;
import org.springframework.context.MessageSourceAware;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.context.weaving.LoadTimeWeaverAware;
import org.springframework.core.io.ResourceLoader;
import org.springframework.instrument.classloading.LoadTimeWeaver;
import org.springframework.jmx.export.notification.NotificationPublisher;
import org.springframework.jmx.export.notification.NotificationPublisherAware;
public class DemoBean implements ApplicationContextAware,
ApplicationEventPublisherAware, BeanClassLoaderAware, BeanFactoryAware,
BeanNameAware, LoadTimeWeaverAware, MessageSourceAware,
NotificationPublisherAware, ResourceLoaderAware
{
@Override
public void setResourceLoader(ResourceLoader arg0) {
// TODO Auto-generated method stub
}
@Override
public void setNotificationPublisher(NotificationPublisher arg0) {
// TODO Auto-generated method stub
}
@Override
public void setMessageSource(MessageSource arg0) {
// TODO Auto-generated method stub
}
@Override
public void setLoadTimeWeaver(LoadTimeWeaver arg0) {
// TODO Auto-generated method stub
}
@Override
public void setBeanName(String arg0) {
// TODO Auto-generated method stub
}
@Override
public void setBeanFactory(BeanFactory arg0) throws BeansException {
// TODO Auto-generated method stub
}
@Override
public void setBeanClassLoader(ClassLoader arg0) {
// TODO Auto-generated method stub
}
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher arg0) {
// TODO Auto-generated method stub
}
@Override
public void setApplicationContext(ApplicationContext arg0)
throws BeansException {
// TODO Auto-generated method stub
}
}
настроитьinit()а такжеdestroy()метод
beanпо умолчанию в конфигурационном файлеinitа такжеdestroyСуществует два способа определения методов:
- относится к одному
BeanизBeanместное определение - Глобальное определение относится к
beanвсе определено в контекстеbean
Beanместное определение
Местные определения следующие:
<beans>
<bean id="demoBean" class="com.howtodoinjava.task.DemoBean"
init-method="customInit"
destroy-method="customDestroy"></bean>
</beans>
глобальное определение
Глобально определенные следующим образом, методы будут<beans>Все отдано под тегомbeanОпределить вызов. Когда у вас есть конфигурация, которую можно использовать для всехbeanОпределите общие имена методов (например,init()а такжеdestroy()) это практично. помогает вам не нужноbeanодно упоминаниеinitа такжеdestroyметод.
<beans default-init-method="customInit" default-destroy-method="customDestroy">
<bean id="demoBean" class="com.howtodoinjava.task.DemoBean"></bean>
</beans>
JavaПример кода программы:
package cn.howtodoinjava.task;
public class DemoBean
{
public void customInit()
{
System.out.println("Method customInit() invoked...");
}
public void customDestroy()
{
System.out.println("Method customDestroy() invoked...");
}
}
@PostConstructа также@PreDestroyаннотация
отSpring 2.5Для начала вы также можете использовать аннотации для передачи@PostConstructа также@PreDestroyАннотации определяют методы жизненного цикла.
-
@PostConstructАннотированные методы будут созданы с использованием конструктора по умолчанию.beanВызывается после и до того, как его экземпляр будет возвращен объекту запроса. -
@PreDestroyМетод аннотации вbeanвскореbeanВызывается перед уничтожением контейнера.
JavaПример кода выглядит следующим образом:
package cn.howtodoinjava.task;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class DemoBean
{
@PostConstruct
public void customInit()
{
System.out.println("Method customInit() invoked...");
}
@PreDestroy
public void customDestroy()
{
System.out.println("Method customDestroy() invoked...");
}
}
В общем, все это связано сSpringвнутри контейнераSpring beanЖизненный цикл.记住给定的生命周期事件类型,这是SpringЧасто задаваемые вопросы в интервью.
Оригинальная ссылка:Весна 5 — прицелы Bean