bean的生命周期:创建—-初始化—-销毁。

Spring中声明的Bean的初始化和销毁方法有4种方式:

  1. @Bean的注解的initMethod、DestroyMethod属性
  2. bean实现InitializingBean、DisposableBean接口
  3. @PostConstruct、@PreDestroy注解
  4. BeanPostProcessor(这种仅仅增强了Bean的初始化方法

@Bean的注解的initMethod、DestroyMethod属性

cat类

  1. public class Cat {
  2. public Cat() {
  3. System.out.println("cat...constructor...");
  4. }
  5. public void init() {
  6. System.out.println("cat...init...");
  7. }
  8. public void destroy() {
  9. System.out.println("cat...destory...");
  10. }
  11. }

配置类

  1. @Configuration
  2. public class SpringConfig {
  3. @Bean(name = "cat", initMethod = "init", destroyMethod = "destroy")
  4. public Cat getCat() {
  5. return new Cat();
  6. }
  7. }

测试代码

  1. @Test
  2. public void testLifeCycle() {
  3. AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
  4. System.out.println("IOC容器创建了...");
  5. context.close();
  6. }

测试结果

Bean的初始化、销毁方法的方式 - 图1

实现InitializingBean、DisposableBean接口

实现InitialzingBean接口的afterPropertiesSet方法,即为bean的初始化方法。

实现DisposableBean接口的destroy方法,即为bean的销毁方法。

dog类

  1. public class Dog implements InitializingBean, DisposableBean {
  2. public Dog() {
  3. System.out.println("dog...constructor...");
  4. }
  5. // Dog类的初始化方法
  6. @Override
  7. public void afterPropertiesSet() throws Exception {
  8. System.out.println("dog...afterPropertiesSet...");
  9. }
  10. // Dog类的销毁方法
  11. @Override
  12. public void destroy() throws Exception {
  13. System.out.println("dog...destroy...");
  14. }
  15. }

配置类

  1. @Configuration
  2. public class SpringConfig {
  3. @Bean(name = "dog")
  4. public Dog getDog() {
  5. return new Dog();
  6. }
  7. }

测试代码

  1. @Test
  2. public void testLifeCycle() {
  3. AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
  4. System.out.println("IOC容器创建了...");
  5. context.close();
  6. }

测试结果

Bean的初始化、销毁方法的方式 - 图2

@PostConstruct、@PreDestroy注解

这两个注解只能标注在方法上,并且@PostConstruct注解标注的方法为bean的初始化方法,@PreDestroy标注的方法为bean的销毁方法。

tiger类

  1. public class Tiger {
  2. public Tiger() {
  3. System.out.println("tiger...constructor");
  4. }
  5. @PostConstruct
  6. public void init() {
  7. System.out.println("tiger...init...");
  8. }
  9. @PreDestroy
  10. public void destroy() {
  11. System.out.println("tiger...destroy...");
  12. }
  13. }

配置类

  1. @Configuration
  2. public class SpringConfig {
  3. @Bean(name = "tiger")
  4. public Tiger getTiger() {
  5. return new Tiger();
  6. }
  7. }

测试代码

  1. @Test
  2. public void testLifeCycle() {
  3. AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
  4. System.out.println("IOC容器创建了...");
  5. context.close();
  6. }

测试结果

Bean的初始化、销毁方法的方式 - 图3

实现BeanPostProcessor

BeanPostProcessor是一个接口,这个接口中的postProcessBeforeInitializationpostProcessAfterInitialization方法分别在Bean的初始化方法执行的前后执行,本质上不算是声明Bean的初始化和销毁方法的一种,而是仅仅对bean的初始化方法的一个功能增强,并且在Spring中使用非常广泛,例如DI注解Autowired,当IOC容器调用无参构造创建对象之后,就会进行依赖注入,而且依赖注入在Bean的初始化方法执行之前,所以可以适用BeanPostProcessor来完成这一功能,Spring底层也是这么完成的。

MyBeanPostProcessor

  1. public class MyBeanPostProcessor implements BeanPostProcessor {
  2. /**
  3. * 在初始化之前执行
  4. * @param bean 初始化的bean
  5. * @param beanName bean的名字
  6. * @return 初始化的bean或者包装过的bean
  7. * @throws BeansException
  8. */
  9. @Override
  10. public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
  11. System.out.println(beanName + " ==> " + "postProcessBeforeInitialization...");
  12. return bean;
  13. }
  14. /**
  15. * 在初始化之后执行
  16. * @param bean 初始化的bean
  17. * @param beanName bean的名字
  18. * @return 初始化的bean或者包装过的bean
  19. * @throws BeansException
  20. */
  21. @Override
  22. public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
  23. System.out.println(beanName + " ==> " + "postProcessAfterInitialization...");
  24. return bean;
  25. }
  26. }

配置类

  1. @Configuration
  2. public class SpringConfig {
  3. @Bean(name = "tiger")
  4. public Tiger getTiger() {
  5. return new Tiger();
  6. }
  7. @Bean(name = "myBeanPostProcessor")
  8. public MyBeanPostProcessor getMyBeanPostProcessor() {
  9. return new MyBeanPostProcessor();
  10. }
  11. }

测试代码

  1. @Test
  2. public void testLifeCycle() {
  3. AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
  4. System.out.println("IOC容器创建了...");
  5. context.close();
  6. }

测试结果

Bean的初始化、销毁方法的方式 - 图4