生命周期
- Spring对bean进行实例化;
- Spring将值和bean的引用注入到bean对应的属性中;
- 如果bean实现了BeanNameAware接口,Spring调用setBeanName()方法,并传递bean的ID;
- 如果bean实现了BeanFactoryAware接口,Spring调用setBeanFactory()方法,将BeanFactory容器实例传入;
- 如果bean实现了ApplicationContextAware接口,Spring调用setApplicationContext()方法,将bean所在应用上下文的引用传入;
- 如果bean实现了InitializingBean接口,Spring调用afterPropertiesSet()方法;
- 如果bean实现了BeanPostProcessor接口,Spring调用postProcessBeforeInitialization()方法;
- 如果bean实现了BeanPostProcessor接口,Spring调用postProcessAfterInitialization()方法;
- 此时bean已经准备就绪,可以被应用程序使用了,并且将一直存在应用上下文中,直至应用上下文被销毁;
- 若果bean实现了DisposableBean接口,销毁时Spring将调用它的destroy()接口方法。
注意点
《Spring实战》一书中第7步先于第6步执行。但笔者写代码测试是反过来的。
Code
测试bean实体类
public class BeanLifeCycle implements BeanNameAware, BeanFactoryAware, ApplicationContextAware,
BeanPostProcessor, InitializingBean, DisposableBean {
private static Logger logger = LoggerFactory.getLogger(BeanLifeCycle.class);
private String name;
private BeanLifeCycle(){
logger.info("Call method 构造函数.");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "BeanLifeCycle{" +
"name='" + name + '\'' +
'}';
}
@Override
public void setBeanName(String name) {
logger.info("Call method setBeanName.");
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
logger.info("Call method setBeanFactory.");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
logger.info("Call method setApplicationContext.");
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
logger.info("Call method postProcessBeforeInitialization.");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
logger.info("Call method postProcessAfterInitialization.");
return bean;
}
@Override
public void afterPropertiesSet() throws Exception {
logger.info("Call method afterPropertiesSet.");
}
@Override
public void destroy() throws Exception {
logger.info("Call method destroy.");
}
}
main函数
public class IocMain {
private static Logger logger = LoggerFactory.getLogger(IocMain.class);
public static void main(String[] args){
ApplicationContext context = new ClassPathXmlApplicationContext("spring/ioc/ioc-main.xml");
BeanLifeCycle beanLifeCycle = (BeanLifeCycle) context.getBean("beanLifeCycle");
logger.info("{}", beanLifeCycle);
}
}
输出
11:32:16.258 [main] INFO ai.code.mikasa.spring.ioc.BeanLifeCycle - Call method 构造函数.
11:32:16.282 [main] INFO ai.code.mikasa.spring.ioc.BeanLifeCycle - Call method setBeanName.
11:32:16.282 [main] INFO ai.code.mikasa.spring.ioc.BeanLifeCycle - Call method setBeanFactory.
11:32:16.283 [main] INFO ai.code.mikasa.spring.ioc.BeanLifeCycle - Call method setApplicationContext.
11:32:16.283 [main] INFO ai.code.mikasa.spring.ioc.BeanLifeCycle - Call method afterPropertiesSet.
11:32:16.302 [main] INFO ai.code.mikasa.spring.ioc.BeanLifeCycle - Call method postProcessBeforeInitialization.
11:32:16.303 [main] INFO ai.code.mikasa.spring.ioc.BeanLifeCycle - Call method postProcessAfterInitialization.
11:32:16.314 [main] INFO ai.code.mikasa.spring.ioc.IocMain - BeanLifeCycle{name='null'}
网友评论