Spring 之 bean 的生命周期
程序员文章站
2022-03-03 12:39:30
...
bean 的生命周期是指 bean 的创建–初始化–销毁的过程
由容器管理 bean 的生命周期
可以自定义初始化和销毁方法,容器在 bean 进行到当前生命周期的时候调用自定义的初始化和销毁方法
一、使用 @Bean
指定 init-method
和 destroy-method
注解配置
传统的 xml 方式,指定初始化和销毁方法
<bean id="person" class="cn.duniqb.bean.Person" init-method="XXX" destroy-method="XXX">
<property name="age" value="18"/>
<property name="name" value="zs"/>
</bean>
使用注解
Bean 的代码
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 MainConfigLifeCycle {
@Bean(initMethod = "init", destroyMethod = "destroy")
public Car car() {
return new Car();
}
}
测试
public class IOCTestListCycle {
@Test
public void test01() {
// 创建 IOC 容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigLifeCycle.class);
System.out.println("容器创建完成...");
// 关闭
applicationContext.close();
}
}
输出
car constructor...
car init...
容器创建完成...
car destroy...
可以看到,在容器创建时调用构造方法和初始化方法,在主动关闭时,调用销毁方法
总结:
- 构造对象(对象创建)
- 单实例:在容器启动时创建对象
- 多实例:在每次获取时创建对象
- 初始化
- 对象创建完成,并赋值完成后调用初始化方法
- 销毁
- 单实例:容器关闭时销毁
- 多实例:容器不会管理这个 bean,不会调用销毁方法
二、通过让 bean 实现 InitializingBean(定义初始化逻辑),DisposableBean(定义销毁逻辑)
实现 Spring 提供的 2 个接口
@Component
public class Cat implements InitializingBean, DisposableBean {
public Cat() {
System.out.println("cat constructor...");
}
@Override
public void destroy() throws Exception {
System.out.println("cat destroy...");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("cat afterPropertiesSet...");
}
}
在配置类扫描
@ComponentScan("cn.duniqb.bean")
@Configuration
public class MainConfigLifeCycle {}
达到相同效果
三、使用 JSR250
四、使用BeanPostProcessor:bean 的后置处理器
在 bean 初始化前后进行一些处理工作
postProcessBeforeInitialization
postProcessAfterInitialization
@Component
public class MyBeanPostPorcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization..." + beanName + "..." + bean);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization..." + beanName + "..." + bean);
return bean;
}
}
上一篇: 06-Spring的Bean的实例化方式(基于XML)
下一篇: 异常信息国际化