Bean的生命周期


第一步:**
 /**
实例化BeanFactoryPostProcessor该接口,这个接口的方法为 postProcessBeanFactory是在bean创建之前执行的,可以修改bean的元数据也就是说,Spring允许BeanFactoryPostProcessor在容器实例化任何其它bean之前读取配置元数据,并可以根据需要进行修改,例如可以把bean的scope从singleton改为prototype,也可以把property的值给修改掉。可以同时配置多个BeanFactoryPostProcessor,并通过设置'order'属性来控制各个BeanFactoryPostProcessor的执行次序。*/
 void postProcessBeanFactory(ConfigurableListableBeanFactory var1) throws BeansException;
第二步:
上述图中的描述那个接口已过时,现在使用的接口为
InstantiationAwareBeanPostProcessor
在执行构造器之前先执行这个接口的postProcessBeforeInstantiation方法
//这个对象返回的方法 会替换原有的bean
default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
    return null;
}
然后执行bean的构造器
然后执行
//这里返回false会跳过依赖注入阶段
default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
    return true;
}
第三步:依赖注入
进行依赖注入相关的增强 首先执行的还是InstantiationAwareBeanPostProcessor 这个接口中的方法
//解析如 @Autowired、@Value、@Resource
@Nullable
default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
    return null;
}
依赖注入后如果这个bean实现了BeanNameAware接口或者BeanFactoryAware接口或者其他aware会进行执行,只要是设置bean的名字之类的一些配置
第四步:初始化
/*初始化之前执行postProcessBeforeInitialization
* 这里返回的对象会替换掉原本的 bean
* 如 @PostConstruct、@ConfigurationProperties*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    if (beanName.equals("lifeCycleBean"))
        System.out.println("<<<<<< 初始化之前执行, 这里返回的对象会替换掉原本的 bean, 如 @PostConstruct、@ConfigurationProperties");
    return bean;
}
然后调用初始化方法
@PostConstruct
public void init(){
    System.out.println("初始化");
}
//初始化之后执行
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    if (beanName.equals("lifeCycleBean"))
        System.out.println("<<<<<< 初始化之后执行, 这里返回的对象会替换掉原本的 bean, 如代理增强");
    return bean;
}
第五步:销毁
执行销毁之前的方法 实现的接口是
 DestructionAwareBeanPostProcessor 
首先执行这个方法
@Override
public boolean requiresDestruction(Object bean) {
    Class<?> aClass = bean.getClass();
    if(aClass==LifeCycleBean.class){
        System.out.println("你看我何时被销毁");
    }
    return true;
}
//最终被销毁
@PreDestroy
public void destory(){
    System.out.println("销毁");
}
代码演示
package com.zf.reviewspring.a03;
        import org.slf4j.Logger;
        import org.slf4j.LoggerFactory;
        import org.springframework.beans.BeansException;
        import org.springframework.beans.factory.BeanFactory;
        import org.springframework.beans.factory.BeanFactoryAware;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.beans.factory.annotation.Value;
        import org.springframework.stereotype.Component;
        import javax.annotation.PostConstruct;
        import javax.annotation.PreDestroy;
/**
 * 执行顺序
 * 构造---注入---初始化--销毁
 */
@Component
public class LifeCycleBean  implements BeanFactoryAware {
    private static final Logger log= LoggerFactory.getLogger(LifeCycleBean.class);
    public LifeCycleBean() {
        System.out.println("构造");
    }
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("----------------BeanFactory");
    }
    @Autowired
    //也是进行bean注入  如果不加@Value则不是  如果加了@Value是以值进行诸如
    public void autowired(@Value("${JAVA_HOME}")String home){
        System.out.println("依赖注入:{}"+home);
    }
    /**
     * @PostConstruct基本:
     * @PostConstruct注解好多人以为是Spring提供的。其实是Java自己的注解。
     *
     *
     * Java中该注解的说明:@PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。
     * 通常我们会是在Spring框架中使用到@PostConstruct注解 该注解的方法在整个Bean初始化中的执行顺序:
     * Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)
     */
    @PostConstruct
    public void init(){
        System.out.println("初始化");
    }
    @PreDestroy
    public void destory(){
        System.out.println("销毁");
    }
}
package com.zf.reviewspring.a03;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.config.*;
import org.springframework.stereotype.Component;
@Component
public class MyBeanPostProcessor implements BeanFactoryPostProcessor, InstantiationAwareBeanPostProcessor, DestructionAwareBeanPostProcessor {
    private static final Logger log = LoggerFactory.getLogger(MyBeanPostProcessor.class);
    /**
     * 实现该接口,可以在spring的bean创建之前,修改bean的定义属性。
     * 也就是说,Spring允许BeanFactoryPostProcessor在容器实例化任何其它bean之前读取配置元数据,
     * 并可以根据需要进行修改,例如可以把bean的scope从singleton改为prototype,也可以把property的值给修改掉。
     * 可以同时配置多个BeanFactoryPostProcessor,并通过设置'order'属性来控制各个BeanFactoryPostProcessor的执行次序。
     * @param configurableListableBeanFactory
     * @throws BeansException
     */
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        System.out.println("\n" +
                "        System.out.println(\"调用MyBeanFactoryPostProcessor的postProcessBeanFactory\")");
    }
    @Override
    public boolean requiresDestruction(Object bean) {
        Class<?> aClass = bean.getClass();
        if(aClass==LifeCycleBean.class){
            System.out.println("你看我何时被销毁");
        }
        return true;
    }
    @Override
    public void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException {
        if (beanName.equals("lifeCycleBean"))
            System.out.println("<<<<<< 销毁之前执行, 如 @PreDestroy");
    }
    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        if (beanName.equals("lifeCycleBean"))
            System.out.println("<<<<<< 实例化之前执行, 这里返回的对象会替换掉原本的 bean");
        return null;
    }
    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        if (beanName.equals("lifeCycleBean")) {
            System.out.println("<<<<<< 实例化之后执行, 这里如果返回 false 会跳过依赖注入阶段");
         //  return false;
        }
        return true;
    }
    @Override
    public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
        if (beanName.equals("lifeCycleBean"))
            System.out.println("<<<<<< 依赖注入阶段执行, 如 @Autowired、@Value、@Resource");
        return pvs;
    }
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("lifeCycleBean"))
            System.out.println("<<<<<< 初始化之前执行, 这里返回的对象会替换掉原本的 bean, 如 @PostConstruct、@ConfigurationProperties");
        return bean;
    }
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("lifeCycleBean"))
            System.out.println("<<<<<< 初始化之后执行, 这里返回的对象会替换掉原本的 bean, 如代理增强");
        return bean;
    }
}
System.out.println("调用MyBeanFactoryPostProcessor的postProcessBeanFactory")
<<<<<< 实例化之前执行, 这里返回的对象会替换掉原本的 bean
构造
<<<<<< 实例化之后执行, 这里如果返回 false 会跳过依赖注入阶段
<<<<<< 依赖注入阶段执行, 如 @Autowired、@Value、@Resource
依赖注入:{}D:\tools\jdk1.8.0_191
----------------BeanFactory
<<<<<< 初始化之前执行, 这里返回的对象会替换掉原本的 bean, 如 @PostConstruct、@ConfigurationProperties
初始化
<<<<<< 初始化之后执行, 这里返回的对象会替换掉原本的 bean, 如代理增强
你看我何时被销毁
你看我何时被销毁
2022-05-10 20:57:23.728  INFO 88376 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2022-05-10 20:57:23.739  INFO 88376 --- [           main] com.zf.reviewspring.a03.A03Application   : Started A03Application in 2.107 seconds (JVM running for 3.627)
com.zf.reviewspring.a03.LifeCycleBean@3ff57625
<<<<<< 销毁之前执行, 如 @PreDestroy
销毁
Process finished with exit code 0