Bean的生命周期

Bean 的生命周期

执行顺序:

  1. 无参构造函数
  2. 依赖注入(包括属性注入)
  3. 初始化方法
  4. 销毁方法
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 ComponentBean {
    private static final Logger logger = LoggerFactory.getLogger(ComponentBean.class);
    private static int i = 0;

    private String name;

    /**
     * 由于没有进行日志设置的配置, 因此默认情况下logger.debug()并不会被输出
     */
    public ComponentBean() {
        logger.error("无参构造函数:{}", i++);
    }

    /**
     * @Autowired注解添加在方法上, 和@Bean的效果类似, 会从Spring容器中按类型查找形参对象, 
     * 但是如果形参是String类型, 则需要额外使用@Value进行注入. 暂且将其当作@Value为成员变量进行依赖注入
     */
    @Autowired
    public void setAutowired(@Value("${JAVA_HOME}") String path) {
        logger.error("Autowired方法:{}", i++);
    }

    public void setName(String name) {
        this.name = name;
        logger.error("set方法进行属性注入:{}", i++);
    }

    @PostConstruct
    public void init() {
        logger.error("postConstruct注解:{}", i++);
    }

    @PreDestroy
    public void destroy() {
        logger.error("preDestroy注解:{}", i++);
    }
}

BeanPostProcessor Bean后置处理器

模板方法设计模式

模板方法中的某个位置:对应一个函数式接口

一种增强:对应函数式接口的一个实现(或者称为一个lambda表达式)

import java.util.ArrayList;
import java.util.List;

public class TemplateMethodMain {

    List<MyPostProcessor> postProcessors = new ArrayList<>();

    public void addPostProcessor(MyPostProcessor myPostProcessor) {
        postProcessors.add(myPostProcessor);
    }


    public void runV1() {
        System.out.println("构造器");
        System.out.println("依赖注入");
        System.out.println("初始化");
    }

    public void runV2() {
        System.out.println("构造器");
        System.out.println("依赖注入");
        // 处理每一个的增强功能
        for (MyPostProcessor postProcessor : postProcessors) {
            postProcessor.deal();
        }
        System.out.println("初始化");
    }


    public static void main(String[] args) {
        TemplateMethodMain templateMethodMain = new TemplateMethodMain();
        // 使用者添加功能即可, 不需要修改原有的类
        templateMethodMain.addPostProcessor(() -> System.out.println("解析@MyAutowired注解"));
        templateMethodMain.addPostProcessor(() -> System.out.println("解析@MyResource注解"));
        templateMethodMain.runV2();
    }
}


interface MyPostProcessor {
    void deal();
}

Bean生命周期的各个阶段(注解+Bean后处理器)


   转载规则


《Bean的生命周期》 熊水斌 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Order接口的排序逻辑 Order接口的排序逻辑
OrderComparator 的排序逻辑 OrderComparator 实现了 Comparator 接口,重写 compare() 方法 compare() 方法内部仅仅是调用了 doCompare() 方法,因此 doCompar
2023-04-13
下一篇 
StemGNN(2020 NIPS)Preliminary此文做的是多变量时序预测任务。像通过一支股票的走势预测它未来的价格是单变量时序预测,如果同时观察多支股票并作出相应预测即可看成是多变量时序预测。 Challenge多变量时序预测往
2023-04-11
  目录