Springbean生命周期详解

在传统的java应用中,JavaBean的生命周期一般都是浅化理解,就是在在Java中使用关键字new把Bean进行实例化,然后Bean就可以使用了,一旦不使用了,Java会自动进行垃圾回收。

如果是在springBean里面,Bean的生命周期就显得非常复杂,我把它详细了解了一下,分为十个步骤:

  1. Bean的实例化:spring启动后,会查找和加载需要被spring管理的Bean,并且实例化。
  2. Bean属性注入:Bean被实例化后对将Bean的引入和值注入到Bean的属性中。
  3. 调用BeanNameAware的setBeanName()方法:如果实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法。
  4. 调用BeanFactoryAware的setBeanFactory()方法:如果Bean实现了BeanFactoryAware接口的话,spring就将调用他们的setBeanFactory()方法,将BeanFactory容器实例传入。
  5. 调用ApplicationContextAware的setApplicationContext方法:如果Bean实现了ApplicationContextAware接口的话,spring将调用Bean的setApplicationContext方法,将Bean所在用用上下文引用传入进来。
  6. 调用BeanPostProcessor的预初始化方法:如果Bean实现了BeanPostProcessor接口,spring将调用他们的postProcessBeforeInitialization()方法。
  7. 调用InitializingBean的afterPropertiesSet()方法:如果Bean实现了InitializingBean接口,spring将调用他们的afterPropertiesSet()方法,类似的,如果Bean使用init-method生命了初始化方法的话,这个方法也会被调用。
  8. 调用BeanPostProcessor的初始化后的方法:如果Bean实现了BeanPostProcessor接口,spring就将调用他们的postprocessAfterInitialization()方法。
  9. Bean可以使用了:这个时候,Bean就已经准备好了,可以被应用程序使用了,他们将一直驻留在应用的上下文中,直到应用的上下文被销毁。
  10. 调用DisposableBean的destory()方法:如果Bean实现DisposableBean接口,spring将嗲用他的destory()就扣方法,相同的,如果Bean使用了destory-method生命销毁方法,该方法也会被调用。

以上就是spring中Bean的核心接口和生命周期,但是翻阅JavaDoc文档发现除了以上接口外,还有另外的初始化过程设计的接口。

Springbean生命周期详解_第1张图片

                        springBean生命周期的详解图

Bean完整的生命周期

文字解释如下:

----------初始化----------

BeanNameAware.setBeanName()在创建此Bean的Bean工厂设置Bean的名称,在普通属性设置之后再调用,在InitializingBean.afterPropertiesSet()方法之前调用。

BeanClassLoadeAware.setBeanClassLoader():在普通属性设置之后,InitializingBean.afterPropertiesSet()之前调用。

BeanFactoryAware.setBeanFactory():回调提供了自己的Bean实例工厂,在普通实行设置后,在InitializingBean.afterPropertiesSet()或者自定义初始化方法之前调用。

EnvironmentAware.setEnvironment():设置environment在组件使用是调用。

EmbeddedValueResolverAware.setEmbeddedValueResolver():设置StringValueResolver用来解决嵌入式的值域问题。

ResourceLoaderAware.setResourceLoader():在普通Bean对象之后调用,在afterPropertiesSet或者自定义的init-method之前调用,在ApplicationContextAware之前调用。

ApplicationEventPublisherAware.setApplicationEventPublisher():在普通Bean书香之后调用,在初始化调用afterpropertiesSet或者自定义初始化方法之前调用。在ApplicationContextAware之前调用。

MessageSourceAware.setMessageSource():在普通Bean属性之后条用,在初始化调用afterPropertiesSet或者自定义初始化方法之前调用,在A品牌力擦体哦那ContextAware之前调用。

ApplicationContextAware.setApplicationContext():在普通Bean对象生成之后调用,在InitializingBean.afterPropertiesSet之前调用或者用户自定义初始化方法之前。在ReasourceLoaderAware.setResourceLoader,ApplicationEcentPublisherAware.setApplicationEvenPublisher,MessageSourceAware之后使用。

ServketContextAware.setServletContext():运行时设置ServletContext,在普通Bean初始化后调用,在InitializingBean.aftePropertiesSet之前调用,在ApplicationContextAware之后调用。

注意:实在WebApplicationContext运行时。

BeanPostProcessor.postPricessBeforeInitialization():将此BeanPostProcessor应用与给定的新B额按实例,在任何Bean初始化回调方法(像是InitializingBean.afterPropertiesSet或者自定义的初始化方法)之前调用。这个Bean将要准备天秤属性的值。返回的Bean实例可能被普通对象包装,默认实现返回时一个Bean。

BeanPostProcessor.postPricessAfterInitialization():将此BeanPostProcessor应用与给定的新B额按实例,在任何Bean初始化回调方法(像是InitializingBean.afterPropertiesSet或者自定义的初始化方法)之后调用。这个Bean将要准备填充属性的值。返回的Bean实例可能被普通对象包装。

InitializingBean.afterPropertiesSet():被BeanFactory在设置所有Bean属性之后调用(并且满足BeanFactory和ApplicationContextAware)。

---------销毁----------

在BeanFactory关闭的时候,Bean 的生命周期会调用如下方法:

DestructionAwareBeanPostProcessor.postProcessBeforeDestruction():在销毁之前将此BeanProcessor应用于给定的Bean实例。能够调用自定义回调,像是DisposableBean的销毁和自定义销毁方法,这个回调仅仅适用于Factory中的单例Bean(包括内壁Bean)。

你可能感兴趣的:(java,spring,intellij-idea)