bean的生命周期
1.什么是bean?
Spring Bean是被实例的,组装的及被Spring 容器管理的Java对象。
Spring 容器会自动完成@bean对象的实例化。
创建应用对象之间的协作关系的行为称为:装配(wiring),这就是依赖注入的本质
bean的创建–初始化–销毁,默认都是容器自动完成,容器管理bean的生命周期
我们可以自定义初始化和销毁方法,当容器进行到bean的初始化和销毁时会默认执行我们自定义的方法
2.@Bean注解指定初始化和销毁方法
原来需要在xml的配置里面手动配置init-method和destory-method方法
自定的方法的要求需要没有参数可以抛出异常
指定init-method和destory-method
public class Car {
public Car(){
System.out.println("car ...constructor");
}
public void init(){
System.out.println("car ...init");
}
public void destroy(){
System.out.println("car ...destroy");
}
}
@Configuration
public class MyNewLifeCycle {
@Bean
public Car car(){
return new Car();
}
}
public class LifeCycle {
@Test
public void test01(){
//第一步 创建ioc容器
ApplicationContext context = new AnnotationConfigApplicationContext(MyNewLifeCycle.class);
System.out.println("ioc容器创建完毕");
}
}
可以看到当容器创建时容器中的bean也会被创建;
构造(对象创建):单实例:容器创建时创建对象
多实例:容器创建时不创建对象,当每次获取的时候才会创建对象
可以在bean注解上加上自定义的初始化和销毁方法
单例时:
再次运行
不难发现,组件会先创建然后初始化
初始化:对象创建好,并赋值好时执行初始化方法,当容器关闭的时候bean组件将会被销毁。
多实例时:
组件的创建不会随容器的创建而创建,而是当请求获取的时候才会去创建实例对象
多实例的bean的创建由容器管理,但是多实例的销毁不由容器销毁这个时候我们可以自己手动调用销毁方法。
构造(对象创建)
单实例:在容器启动的时候创建对象
多实例:在每次获取的时候创建对象
初始化:
对象创建完成,并赋值好,调用初始化方法。。。
销毁:
单实例:容器关闭的时候销毁
多实例:容器不会管理这个bean;容器不会调用销毁方法;
3. 实现初始化接口InitializingBean 和 销毁接口DisposableBean
通过让Bean实现InitializingBean(定义初始化逻辑); DisposableBean(定义销毁逻辑);
@Component//告诉spring这个组件,并将它放入到容器当中
public class Cat implements InitializingBean, DisposableBean {
public Cat(){
System.out.println("cat >>> constructor");
}
//在容器关闭之后会执行销毁方法
public void destroy() throws Exception {
System.out.println("cat >>> destroy");
}
//在属性设置完成之后,执行初始化操作
public void afterPropertiesSet() throws Exception {
System.out.println("cat >>> init");
}
}
4. 使用JSR250 java中的注解
@PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化方法
@PreDestroy:在容器销毁bean之前通知我们进行清理工作
@Component
public class Fish {
public Fish(){
System.out.println("fish >> constructor");
}
@PostConstruct//对象创建并赋值之后调用
public void init(){
System.out.println("Fish >> @PostConstruct");
}
@PreDestroy//容器移除对象之前
public void destroy(){
System.out.println("fish >> 销毁");
}
}
5.使用接口 BeanPostProcessor :bean的后置处理器
接口BeanPostProcessor是 在bean初始化前后进行一些处理工作;
- postProcessBeforeInitialization:在初始化之前工作
- postProcessAfterInitialization:在初始化之后工作
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization"+bean+">>"+beanName);
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization"+bean+">>"+beanName);
return bean;
}
}
小结
1)、指定初始化和销毁方法;
通过@Bean指定init-method和destroy-method;
2)、通过让Bean实现InitializingBean(定义初始化逻辑),
DisposableBean(定义销毁逻辑);
3)、可以使用JSR250;
@PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化方法
@PreDestroy:在容器销毁bean之前通知我们进行清理工作
4)、BeanPostProcessor【interface】:bean的后置处理器;
在bean初始化前后进行一些处理工作;
postProcessBeforeInitialization:在初始化之前工作
postProcessAfterInitialization:在初始化之后工作