Bean的生命周期
bean的生命周期:bean创建—初始化----销毁过程。
容器管理bean的生命周期:我们可以自定义初始化和销毁方法;容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法。
构造(对象创建)
单实例:在容器启动的时候创建对象
多实例:在每次获取的时候创建对象
初始化:对象创建完成,并赋值好,调用初始化方法。
销毁:
单实例:容器关闭的时候
多实例:容器不会管理这个bean,容器不会调用销毁方法。
在spring中,实在spring配置文件中注册bean时,使用init-method和destroy-method来制定初始化方法和销毁方法。
1.指定初始化和销毁方法—通过@Bean指定init-method
和destroy-method
。
示例:
创建一个bean(Car),在该;类中创建自定义的初始化和销毁方法,如下:
public class Car {
public Car() {
System.out.println("创建car.......");
}
public void init(){
System.out.println("car......init.....");
}
public void destroy(){
System.out.println("car......destroy.....");
}
}
在配置类中使用@Bean将该bean注册到容器中,并指定初始化和销毁方法。
@Configuration
@ComponentScan(basePackages = {"com.fzl.bean"})
public class MainConfigOfLifeCycle {
// 通过@Bean指定init-method和destroy-method,
@Bean(initMethod = "init",destroyMethod = "destroy")
public Car car(){
return new Car();
}
}
通过@Bean()在括号内使用initMethod和destroyMethod来设置自定义初始化和销毁方法。
2.通过Bean实现InitializingBean
(定义初始化逻辑),DisposableBean
(定义销毁逻辑)
示例:
创建一个Bean(例如Cat),让其实现InitializingBean
和DisposableBean
接口,并实现两个接口中的方法。并在该类上加上@Component注解,将其注册到容器中。
@Component
public class Cat implements InitializingBean, DisposableBean {
public void destroy() throws Exception {
System.out.println("Cat........destroy...");
}
public void afterPropertiesSet() throws Exception {
System.out.println("Cat.......init");
}
}
3.可以使用JSR250:
@PostConstruct
:在bean创建完成并且属性赋值完成,来执行初始化方法。
@PreDestroy
:在容器销毁bean之前通知我们进行清理工作。
示例:
创建一个Bean例如Dog.java,在该类中写出吧其无参构造,自定义初始化方法和自定义销毁方法,然后在自定义的初始化方法和销毁方法上分别加上@PostConstruct
、@PreSestroy
注解。在Dog类名上加上@Component注解,将该bean注入到IOC容器中。然后就可以了。代码如下:
@Component
public class Dog {
public Dog(){
System.out.println("Dog......constructor......");
}
//对象创建并赋值之后调用
@PostConstruct
public void init(){
System.out.println("Dog......PostConstruct......");
}
//容器移除对象之前调用
@PreDestroy
public void destroy(){
System.out.println("Dog......PreDestroy......");
}
}
4. BeanPostProcessor【interface】:bean的后置处理器
在bean初始化前后进行一些处理工作。
postProcessBeforeInitialization
:在初始化之前工作。
postProcessAfterInitialization
:在初始化之后工作。
示例:
创建一个bean(例如MyBeanPostProcessor),让其实现BeanPostProcessor接口以及接口中的方法。并在类名前加上@Component注解,将该bean注入到IOC容器中。
/**
* 后置处理器,初始化前后进行处理工作
*/
//将后置处理器加入到容器中
@Component
public class MyBeanPostProcess implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String s) throws BeansException {
System.out.println("postProcessBeforeInitialization................"+bean);
return bean;
}
public Object postProcessAfterInitialization(Object bean, String s) throws BeansException {
System.out.println("postProcessAfterInitialization................"+bean);
return bean;
}
}