Spring-对象生命周期管理

简述

Spring对对象生命周期的依次分为:

  • 对象的创建(Construct)
  • 对象的初始化前(BeforeInit)
  • 对象创建之后(PostConstruct)
  • 对象的初始化(Init)
  • 对象的初始化后(AfterInit)
  • 对象销毁前(PreDestroy)
  • 对象的销毁(Destroy)

如果是单例的对象:

  • 在容器启动的时候调用构造方法创建对象。
  • 在容器关闭的时候调用销毁方法销毁对象。

如果是多例的对象:

  • 每次调用的时候调用构造方法创建对象。
  • 容器不会管理这个bean;容器不会调用销毁方法;

下面具体介绍,如何使用spring来对对象的各个生命周期进行管理。

自定义初始化和销毁方法

通过xml

    
        
        
        
    

通过接口

对象需要实现InitializingBean的afterPropertiesSet方法和DisposableBean的destroy方法

public class User implements InitializingBean,DisposableBean{
......
    public void destroy() {
        System.out.println("user destory");
    }
    
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("user afterPropertiesSet");
    }
......
}

通过注解

    // 给容器中注册一个Bean;类型为返回值的类型,id默认是用方法名作为id
    @Bean(initMethod = "init", destroyMethod = "destroy")
    public UserAnno userAnno() {
        return new UserAnno("doyoung", 20, "doyoungdy");
    }

问题

当对象不但配置了xml和接口的情况下会出现什么情况呢?
通过测试会发现:

  • 当xml的init-method为afterPropertiesSet方法时,或destroy-method为destory方法时,只会调用一次
  • 当xml的init-method不为afterPropertiesSet方法时,或destroy-method不为destory方法时,先调接口的方法再调用xml配置的方法

实现对象的初始化前后的控制

了为实现对对象初始化前后的控制,需要实现一个BeanPostProcessor接口,即在接口InitializingBeanafterPropertiesSet方法前后执行,或在xml中对对象的init-method配置的方法前后执行。
如果有配置注解PostConstruct,它将在PostConstruct之前执行)该接口具体定义如下:

package org.springframework.beans.factory.config;

import org.springframework.beans.BeansException;
public interface BeanPostProcessor {
        /** 对对象的初始化前的控制*/
    Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
        /** 对对象的初始化后的控制*/
    Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}

我们也可以看到spring实现了很多的BeanPostProcessor,来实现对象生命周期的管理。


BeanPostProcessor.png

实现对象构造后及销毁前的控制

对这两个结点的控制实际是为了实现对JSR250的支持。通过使用注解:
@PostConstruct:在对象创建完成并且属性赋值完成,通过调用注解标注的方法完成其它工作。
@PreDestroy:在容器销毁bean之前,通过调用注解标注的方法对对象进行清理工作。

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
......
    @PostConstruct
    public void postConstruct() {
        System.out.println("user PostConstruct");
    }
    
    @PreDestroy
    public void preDestroy() {
        System.out.println("user PreDestroy");
    }

你可能感兴趣的:(Spring-对象生命周期管理)