传统的java对象的生命周期很简单。使用new关键字创建一个对象,就可以使用了。当不再需要使用时,由Java虚拟机自动进行回收。
Spring中bean的生命周期相对要复杂很多。Spring在创建bean的过程中提供了很多扩展点来允许我们自定义bean的创建过程。
先看下面这张bean的生命周期图
上图截取至 《spring in action 》 这本书。详细的描述了bean在Spring容器中从创建到销毁经历的若干阶段。每一个阶段都可以针对Spring如何管理bean进行个性化定制。
对上图的流程进行详细的描述:
以上就是参考 《spring in action 》 这本书中描述的Spring容器中bean的生命周期过程,简单来说就是 创建-使用-销毁,在创建时你可以实现Spring提供的接口对创建过程进行干预,在销毁时也可以实现Spring提供的接口对销毁过程进行干预。
下面编码验证
public class TestBean implements BeanNameAware, BeanFactoryAware, ApplicationContextAware,InitializingBean,
DisposableBean {
private BeanFactory factory;
private ApplicationContext applicationContext;
public TestBean(){
System.out.println("TestBean 类实例化...");
}
public void doSomething(){
System.out.println("调用bean对象的业务方法 doSomething...");
}
@Override
public void setBeanName(String s) {
System.out.println("BeanNameAware接口的 setBeanName方法被调用,Bean的名称为:" + s);
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.factory = beanFactory;
System.out.println("BeanFactoryAware接口的 setBeanFactory方法被调用");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
System.out.println("ApplicationContextAware接口的 setApplicationContext方法被调用");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("InitializingBean接口的 afterPropertiesSet方法被调用");
}
@PostConstruct
public void postConstruct(){
System.out.println("自定义的 postConstruct 方法被调用");
}
@Override
public void destroy() throws Exception {
System.out.println("DisposableBean接口的 destroy方法被调用");
}
@PreDestroy
public void preDestroy(){
System.out.println("自定义的 preDestroy 方法被调用");
}
public void initMethod(){
System.out.println("自定义的 initMethod 方法被调用");
}
public void destroyMethod(){
System.out.println("自定义的 destroyMethod 方法被调用");
}
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization--实例化的bean对象:"+bean+"\t"+beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization...实例化的bean对象:"+bean+"\t"+beanName);
return bean;
}
}
@Configuration
public class TestConfig{
@Bean
public MyBeanPostProcessor myBeanPostProcessor(){
return new MyBeanPostProcessor();
}
@Bean(initMethod = "initMethod",destroyMethod = "destroyMethod")
public TestBean testBean(){
return new TestBean();
}
}
public class TestMain {
public static void main(String[] args) {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(TestConfig.class);
TestBean testBean = annotationConfigApplicationContext.getBean(TestBean.class);
testBean.doSomething();
annotationConfigApplicationContext.close();
}
}
TestBean 类实例化...
BeanNameAware接口的 setBeanName方法被调用,Bean的名称为:testBean
BeanFactoryAware接口的 setBeanFactory方法被调用
ApplicationContextAware接口的 setApplicationContext方法被调用
postProcessBeforeInitialization--实例化的bean对象:com.demo.TestBean@77d67cf3 testBean
自定义的 postConstruct 方法被调用
InitializingBean接口的 afterPropertiesSet方法被调用
自定义的 initMethod 方法被调用
postProcessAfterInitialization...实例化的bean对象:com.demo.TestBean@77d67cf3 testBean
调用bean对象的业务方法 doSomething...
自定义的 preDestroy 方法被调用
DisposableBean接口的 destroy方法被调用
自定义的 destroyMethod 方法被调用
验证代码中添加了两个注解方法 @PostConstruct、@PreDestroy 这两个方法有时候经常被用来代替initMethod和destroyMethod方法使用
以上,是我个人的一点浅显理解,有错误或不足之处,请大家指正。