Spring Bean初始化后和销毁前的操作


Spring Bean是有生命周期的,spring容器允许bean在初始化后和销毁前做一些特定操作


有三种方式

第一种:实现InitializingBean和DisposableBean 接口

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

第二种:通过init-method和destroy-method属性指定

public class Dog {
    public void init(){
        System.out.println("=====init=====Dog");
    }
    public void destroy(){
        System.out.println("=====destroy====Dog");
    }
}
@Configuration
public class AcConfig {
    @Bean(initMethod = "init",destroyMethod = "destroy")
    public Dog getDog(){
        return new Dog();
    }
    @Bean
    public Sheep getSheep(){
        return new Sheep();
    }
    @Bean
    public Cat getCat(){
        return new Cat();
    }
}

第三种:通过@PostConstruct或@PreDestroy注解来指定

public class Sheep {
    @PostConstruct
    public void init() {
        System.out.println("=====init=====Sheep");
    }
    @PreDestroy
    public void destroy() {
        System.out.println("=====destroy====Sheep");
    }
}

测试:

public static void main(String[] args) {
    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AcConfig.class);
    Sheep sheep = ac.getBean(Sheep.class);
    Dog dog = ac.getBean(Dog.class);
    Cat cat = ac.getBean(Cat.class);
    System.out.println(sheep);
    System.out.println(dog);
    System.out.println(cat);
    ac.close();
}



还有一个BeanPostProcessor接口(后置处理器),将BeanPostProcessor实现类放入spring容器中管理,在每一个bean操作的时候都会回调BeanPostProcessor的实现类

BeanPostProcessor接口里有两个方法

public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    System.out.println("=======postProcessBeforeInitialization======="+beanName);
    return bean;
}

该postProcessBeforeInitialization方法是在bean实例化、属性注入之后初始化(init-method或者PostConstruct)之前调用。


public Object     postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    System.out.println("======postProcessAfterInitialization======="+beanName);
    return bean;
}


该postProcessAfterInitialization方法是在bean实例化、属性注入、初始化(init-method或者PostConstruct)之后调用。


spring中bean的初始化流程

        实例化bean对象------->设置对象属性------->检查Aware相关接口并设置依赖------->BeanPostProcessor前置处理------->检查是否有实现InitializingBean以决定是否调用afterPropertiesSet方法------->检查是否配置有自定义的init-method方法------->BeanPostProcessor。

        销毁过程

        是否实现DisposableBean接口------->是否配置有自定义的destroy方法。

猜你喜欢

转载自blog.csdn.net/qq_36781718/article/details/80226664