美文网首页spring
Spring原理分析-Bean生命周期

Spring原理分析-Bean生命周期

作者: 石头耳东 | 来源:发表于2022-04-11 23:56 被阅读0次

前置文章:
Spring原理分析-容器&Bean(一)
前置文章主要讲了:BeanFactory原生功能ApplicationContext拓展功能Bean&BeanFactory后置处理器添加及调用ApplicationContext常见实现类 等。

零、本文纲要

  • 一、Bean生命周期
    1、Bean生命周期测试
    2、生命周期顺序
  • 二、自定义BeanPostProcessor实现增强
  • 三、模板方法-设计模式

一、Bean生命周期

1、Bean生命周期测试

  • ① 编写LifeCycleBean类
@Component
public class LifeCycleBean {
    private static final Logger log = LoggerFactory.getLogger(LifeCycleBean.class);

    public LifeCycleBean() {
        log.debug("构造方法()");
    }

    @Autowired
    public void autowire(@Value("${JAVA_HOME}") String home) {
        log.debug("依赖注入: {}", home);
    }

    @PostConstruct
    public void init() {
        log.debug("初始化方法()");
    }

    @PreDestroy
    public void destroy() {
        log.debug("销毁方法()");
    }
}
  • ② 编写启动类
@SpringBootApplication
public class Demo03 {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Demo03.class, args);
        context.close();
    }
}
  • ③ 测试
Bean生命周期.png

2、生命周期顺序

执行顺序:构造方法 → @Autowired → @PostConstruct → @PreDestroy

二、自定义BeanPostProcessor实现增强

  • ① 实现InstantiationAwareBeanPostProcessor与DestructionAwareBeanPostProcessor接口

Ⅰ postProcessBeforeDestruction:销毁前执行,如@PreDestroy;
Ⅱ postProcessBeforeInstantiation:实例化前执行,返回的对象会替换原本的bean;
Ⅲ postProcessAfterInstantiation:实例化后执行,返回的对象会替换原本的bean;
Ⅳ postProcessProperties:依赖注入阶段执行,如@Autowired、@Value、@Resource;
Ⅴ postProcessBeforeInitialization:初始化前执行,返回的对象会替换原本的bean,如@PostConstruct、@ConfigurationProperties;
Ⅵ postProcessAfterInitialization:初始化后执行,,返回的对象会替换原本的bean,如代理增强。

@Component
public class OwnBeanPostProcessor implements InstantiationAwareBeanPostProcessor, DestructionAwareBeanPostProcessor {

    private static final Logger log = LoggerFactory.getLogger(OwnBeanPostProcessor.class);

    @Override
    public void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException {
        if (beanName.equals("lifeCycleBean"))
            log.debug("━━|━━|━━|━━ 销毁之前执行, 如 @PreDestroy");
    }

    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        if (beanName.equals("lifeCycleBean"))
            log.debug("━━|━━|━━|━━ 实例化之前执行, 这里返回的对象会替换掉原本的 bean");
        return null;
    }

    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        if (beanName.equals("lifeCycleBean")) {
            log.debug("━━|━━|━━|━━ 实例化之后执行, 这里如果返回 false 会跳过依赖注入阶段");
//            return false;
        }
        return true;
    }

    @Override
    public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
        if (beanName.equals("lifeCycleBean"))
            log.debug("━━|━━|━━|━━ 依赖注入阶段执行, 如 @Autowired、@Value、@Resource");
        return pvs;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("lifeCycleBean"))
            log.debug("━━|━━|━━|━━ 初始化之前执行, 这里返回的对象会替换掉原本的 bean, 如 @PostConstruct、@ConfigurationProperties");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("lifeCycleBean"))
            log.debug("━━|━━|━━|━━ 初始化之后执行, 这里返回的对象会替换掉原本的 bean, 如代理增强");
        return bean;
    }
}
  • ② 测试
image.png

三、模板方法-设计模式

  • ① 编写测试类
public class TestTemplatePattern {
    public static void main(String[] args) {
        MyBeanFactory beanFactory = new MyBeanFactory();
        beanFactory.getBean();
    }

    static class MyBeanFactory{
        public Object getBean(){
            Object bean = new Object();
            System.out.println("CONSTRUCTOR ====>" + bean);
            System.out.println("DEPENDENCE INJECT ====>" + bean);
            System.out.println("INITIALIZATION ====>" + bean);
            return bean;
        }
    }
}
模板方法模式使用前.png
  • ② 编写后置处理器接口
static interface MyBeanPostProcessor{
    public void postProcessMethod(Object bean);
}
  • ③ 修改MyBeanFactory类

添加如下属性,及方法:

private List<MyBeanPostProcessor> processors = new ArrayList<>();

public void addBeanPostProcessor(MyBeanPostProcessor beanPostProcessor){
    processors.add(beanPostProcessor);
}

public Object getBean(){
    Object bean = new Object();
    System.out.println("CONSTRUCTOR ====>" + bean);
    System.out.println("POST PROCESS PROPERTIES ====>" + bean);
    for (MyBeanPostProcessor processor : processors) {
        processor.postProcessMethod();
    }
    System.out.println("INITIALIZATION ====>" + bean);
    return bean;
}

此时,由于模板方法还没有实现,所以直接测试并没有变化。

  • ④ 修改测试类main方法

通过匿名内部类形式实现接口中的方法,如下:

public static void main(String[] args) {
    MyBeanFactory beanFactory = new MyBeanFactory();
    beanFactory.addBeanPostProcessor(() -> System.out.println("PARSING @Autowired"));
    beanFactory.addBeanPostProcessor(() -> System.out.println("PARSING @Resource"));
    beanFactory.getBean();
}
模板方法模式使用后.png

四、结尾

以上即为Spring原理分析-容器&Bean(二)的全部内容,感谢阅读。

相关文章

网友评论

    本文标题:Spring原理分析-Bean生命周期

    本文链接:https://www.haomeiwen.com/subject/ainwsrtx.html