初始化和销毁方法,单实例的Bean会在容器创建的时候被自动调用。但是需要注意的时候,如果是多实例的配置Bean,则会在获取该实例的时候被调用

InitMethod & destoryMethod

在注入Bean的时候,可以指定Bean的 initdestroy 方法,这两个方法要求是 公有的的无参构造方法

  • init 方法将会在对象创建完成,成员变量赋值完成之后被创建
  • [x] destroy方法将会在context被关闭的时候被调用。

    1. public class Car {
    2. public Car() { System.out.println("Car.Car");}
    3. public void init() { System.out.println("Car.init"); }
    4. public void destroy() { System.out.println("Car.destroy"); }
    5. }
    6. // 注入Bean到IOC
    7. @Bean(initMethod = "init",destroyMethod = "destroy")
    8. public Car car(){
    9. return new Car();
    10. }

创建Spring上下文,可以看到控制台输出

  1. public class AnnotationConfigClassPath {
  2. AnnotationConfigApplicationContext context;
  3. @Before
  4. public void init() {
  5. context = new AnnotationConfigApplicationContext(MainConfig.class);
  6. }
  7. @Test
  8. public void initComplete() {
  9. System.out.println("容器创建完成");
  10. }
  11. }

控制台输出日志如下:

  1. Car.Car
  2. Car.init
  3. 容器创建完成
  4. Car.destroy

InitializingBean & DisposableBean 接口

  1. 除了通过在 `@Bean` 注解上添加初始化方法和销毁方法之外,也可以通过让Beanclass实现 `org.springframework.beans.factory.InitializingBean` 接口,然后实现其接口方法`afterPropertiesSet `来获得在对象创建被复制完成之后调用初始化的方法的能力,其被调用的方法为 `afterPropertiesSet()` ;通过实现 `org.springframework.beans.factory.DisposableBean` 接口,实现 `destroy` 方法来实现容器的销毁方法。
  1. public class Car implements InitializingBean, DisposableBean {
  2. public Car() { System.out.println("Car.Car");}
  3. public void destroy() { System.out.println("Car.destroy"); }
  4. @Override
  5. public void afterPropertiesSet() throws Exception { System.out.println("Car.afterPropertiesSet"); }
  6. }

PostConstruct & PreDestroy 注解

这两个注解属于JSR250 规范的注解,Spring这里对这两个注解提供了支持,可以在Bean中指定无参的方法添加 @PostConstruct 或者 @PreDestory 注解来实现Bean的创建和销毁的生命周期方法。

  1. public class Car {
  2. public Car() {
  3. System.out.println("Car.Car");
  4. }
  5. @PostConstruct
  6. public void postConstruct() {
  7. System.out.println("Car.postConstruct");
  8. }
  9. @PreDestroy
  10. public void preDestroy() throws Exception {
  11. System.out.println("Car.preDestroy");
  12. }
  13. }

BeanPostProcessor 接口

从字面意思上来说,这个接口是Spring提供的Bean的后置处理器, 用于Bean的声明周期方法,此接口提供了两个方法。分别是在Bean创建完成之前,以及Bean的初始化回调方法之前或者之后调用(初始化回调方法值得是上文的多种初始化方法) ,其方法名分别为 postProcessBeforeInitialization(Object bean,String beanName) 以及 postProcessBeforeInitialization(Object bean, String beanName) ,其中的bean值得是当前class创建的bean实例,而beanName值得是当前bean在Spring容器的名称。

下面的代码是实现一个自定义的BeanPostProcessor , 需要注意的是,这个自定义的后置处理器需要被作为组件被扫描到Spring的容器中,否则不会生效,可以通过添加注解 @ComponentScan 注解方法实现

  1. @Configurable
  2. @ComponentScan("com.zhoutao123.spring")
  3. public class MainConfig {}
  1. @Component
  2. public class CustomerBeanPostProcessor implements BeanPostProcessor {
  3. @Override
  4. public Object postProcessBeforeInitialization(Object bean, String beanName)
  5. throws BeansException {
  6. System.out.println("Car.postProcessBeforeInitialization");
  7. return bean;
  8. }
  9. @Override
  10. public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
  11. System.out.println("Car.postProcessAfterInitialization");
  12. return bean;
  13. }
  14. }