Пятая весенняя серия: жизненный цикл бобов

Spring
Пятая весенняя серия: жизненный цикл бобов

Измените мое сердце на свое сердце и глубоко помните друг друга.

Обзор

В этой главе мы узнаем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метод обратного вызова

Диаграмма жизненного цикла

https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2019/10/22/16df1173db3f79c7~tplv-t2oaga2asx-image.image
https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2019/10/22/16df1173db3f79c7~tplv-t2oaga2asx-image.image

Методы обратного вызова жизненного цикла

SpringФреймворк предоставляет следующие 4 метода управленияBeanСобытия жизненного цикла:

  1. InitializingBeanа такжеDisposableBeanинтерфейс обратного вызова
  2. *AwareИнтерфейс предоставляет некоторые специальные реализации
  3. BeanНастройка в конфигурационном файлеinit()а такжеdestroy()метод
  4. @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