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方法。