Spring bean的生命周期
2017-12-18 20:51
555 查看
Instantiate:
Populate properties:依赖注入
BeanNameAware的setBeanName():
BeanFactoryAware的这个方法可以通过传入的工厂参数来获取
BeanPostProcessor的public Object postProcessBeforeInitialization(Object arg0, String arg1) throws BeansException:该方法很酷,它可以做的事情
LifeCycleBean.java
package com.lee.pojo; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; @Component public class LifeCycleBean implements BeanNameAware,BeanFactoryAware,ApplicationContextAware,InitializingBean,DisposableBean{ private void info(String infoMsg){ System.out.println(infoMsg); } @Override public void setBeanName(String arg0) { info("步骤三:如果bean实现了BeanNameAware接口,Spring将bean的ID "+arg0+"传递给setBeanName方法"); } @Override public void setBeanFactory(BeanFactory arg0) throws BeansException { info("步骤四:如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory方法,将BeanFactory容器实例 "+arg0.hashCode()+"传入进来"); } @Override public void setApplicationContext(ApplicationContext arg0) throws BeansException { info("步骤五:如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext方法,将bean所在的应用上下文引用"+arg0.hashCode()+"传入进来"); } @Override public void afterPropertiesSet() throws Exception { info("步骤七:如果bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet方法。类似地,如果bean使用init-method声明了初始化方法,该方法也会被调用"); } @Override public void destroy() throws Exception { info("步骤十:如果bean实现了DisposableBean接口 ,Spring将调用它的destroy接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用"); } }
注意:这里的BeanFactory实例和ApplicationContext实例不是同一个对象,虽然ApplicationContext继承了BeanFactory接口,其实实际的情况是ApplicationContext的实现通常包含一个BeanFactory的实现。比如AnnotationConfigApplicationContext就有一个getBeanFactory()方法。
BeanPostProcessImpl.java
package com.lee.pojo; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.stereotype.Component; @Component public class BeanPostProcessImpl implements BeanPostProcessor { private void info(String infoMsg){ System.out.println(infoMsg); } @Override public Object postProcessBeforeInitialization(Object arg0, String arg1) throws BeansException { info("步骤六:如果有一个公共的bean实现了BeanPostProcessor接口," + "\n\tSpring将调用它们的postProcessBeforeInitialization方法arg0="+arg0+" arg1="+arg1); return arg0; } @Override public Object postProcessAfterInitialization(Object arg0, String arg1) throws BeansException { info("步骤八:如果如果有一个公共的bean实现了BeanPostProcessor接口," + "\n\tSpring将调用它们的postProcessAfterInitialization方法arg0="+arg0+" arg1="+arg1+ "\n\t这一步该bean就在容器中可以使用了"); return arg0; } }注意:BeanPostProcessor的实现一个容器只需要一个,它能干的事就是,截获bean被初始(init-method)化前后,可以做一些修改然后返回给容器。
JavaConfig.java
package com.lee.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component; @Configuration @ComponentScan(basePackages= {"com.lee"}) public class JavaConfig { }
M.java
package com.lee; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import com.lee.config.JavaConfig; public class TestAnnotation { public static void main(String[] args) { AnnotationConfigApplicationContext atxt = new AnnotationConfigApplicationContext(JavaConfig.class); atxt.close(); } }
输出
步骤三:如果bean实现了BeanNameAware接口,Spring将bean的ID lifeCycleBean传递给setBeanName方法 步骤四:如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory方法,将BeanFactory容器实例 22541646传入进来 步骤五:如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext方法,将bean所在的应用上下文引用7125882传入进来 步骤六:如果有一个公共的bean实现了BeanPostProcessor接口, Spring将调用它们的postProcessBeforeInitialization方法arg0=com.lee.pojo.LifeCycleBean@4d6e83 arg1=lifeCycleBean 步骤七:如果bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet方法。类似地,如果bean使用init-method声明了初始化方法,该方法也会被调用 步骤八:如果如果有一个公共的bean实现了BeanPostProcessor接口, Spring将调用它们的postProcessAfterInitialization方法arg0=com.lee.pojo.LifeCycleBean@4d6e83 arg1=lifeCycleBean 这一步该bean就在容器中可以使用了 一月 01, 2018 11:48:18 上午 org.springframework.context.annotation.AnnotationConfigApplicationContext doClose 步骤十:如果bean实现了DisposableBean接口 ,Spring将调用它的destroy接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用
相关文章推荐
- Spring Bean的生命周期管理方法
- spring bean 的生命周期(最全)
- Spring bean的生命周期
- Spring Bean的生命周期之我的理解(三)------BeanFactory和FactoryBean
- Spring Bean的生命周期之我的理解(四)------AbstractAutowireCapableBeanFactory
- spring bean的生命周期
- Spring bean的生命周期init和destory
- spring Bean的生命周期
- Spring Bean的生命周期(非常详细)
- Spring Bean的生命周期监听
- Spring Bean的生命周期
- Spring Bean的生命周期
- Spring bean 的生命周期
- spring bean的生命周期
- Spring Bean的生命周期(非常详细)
- Spring bean 生命周期
- Spring bean的生命周期
- Spring Bean的生命周期
- Spring Bean的生命周期
- Spring Bean的生命周期