Spring容器组件的生命周期:包含Bean的创建,初始化,销毁过程。下面将讨论容器中bean组件生命周期的相关影响因素。
- 在xml配置文件中我们可以给<bean>标签添加init-method 和 destroy-method属性,作为bean创建后的初始化方法和IOC容器关闭后的bean销毁方法。
<bean id="person" class="com.atguigu.ioc.bean.Person" scope="prototype" init-method="getAge" destroy-method="getName">
<property name="name" value="张三"/>
<property name="age" value="20"/>
</bean>
-通过@Bean注解设置参数值initMethod、destroyMethod。
@Configuration
public class MainConfigOfLifeCycle {
@Bean(initMethod = "init",destroyMethod = "destroy")
public Car car(){
return new Car();
}
}
- 通过让bean实现InitializingBean、DisposableBean接口,实现bean的初始化和销毁时方法。
public class InitDispoBean implements InitializingBean, DisposableBean {
//对象创建并属性赋值之后调用
public void afterPropertiesSet() throws Exception {
System.out.println("属性设置完毕!");
}
public void destroy() throws Exception {
System.out.println("容器已销毁了!");
}
}
- JSR250注解:
@PostContruct: 在bean创建完成并且属性赋值完毕后执行初始化方法。
@PreDestroy: 在容器销毁bean实例之前通知我们进行清理工作。
public class Dog {
public Dog(){
System.out.println("dog is Constructor...");
}
@PostConstruct //对象创建并属性赋值之后调用
public void init(){
System.out.println("dog is PostConstruct...");
}
@PreDestroy
public void destroy(){
System.out.println("dog is PreDestroy...");
}
}
- 实现BeanPostProcessor接口: bean的后置处理器,在bean初始化前后进行一些处理工作。
postProcessBeforeInitialization:在实例创建后,初始化init方法执行前执行该方法。
postProcessAfterInitialization: 在实例创建后,初始化init方法执行后执行该方法。
/**
* 添加到容器中,默认会对容器中所有的bean施加
* postProcessBeforeInitialization、postProcessAfterInitialization方法。
*/
public class MyBeanPostProcessor implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization..."+beanName+"=>"+bean);
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization..."+beanName+"=>"+bean);
return bean;
}
}
综上:在容器中测试
@Configuration
@Import({InitDispoBean.class, Dog.class, MyBeanPostProcessor.class})
public class MainConfigOfLifeCycle {
@Bean(initMethod = "init",destroyMethod = "destroy")
public Car car(){
return new Car();
}
}