当前位置: 首页 > news >正文

Spring底层原理学习笔记--第三讲--(bean生命周期与模板方法)

bean生命周期

A03Application.java

package com.lucifer.itheima.a03;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;


@SpringBootApplication
public class A03Application {
    public static void main(String[] args) {
        //执行结果为
        //  2023-11-06 10:41:10.761  INFO 54360 --- [           main] com.lucifer.itheima.a03.LifeCycleBean    : 构造
        //  2023-11-06 10:41:10.764  INFO 54360 --- [           main] com.lucifer.itheima.a03.LifeCycleBean    : 依赖注入
        //  2023-11-06 10:41:10.765  INFO 54360 --- [           main] com.lucifer.itheima.a03.LifeCycleBean    : 初始化
        //  2023-11-06 10:41:11.060  INFO 54360 --- [           main] com.lucifer.itheima.a03.LifeCycleBean    : 销毁
        ConfigurableApplicationContext context = SpringApplication.run(A03Application.class);
        context.close();
    }
}

LifeCycleBean.java

package com.lucifer.itheima.a03;

import lombok.extern.slf4j.Slf4j;
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
@Slf4j
public class LifeCycleBean {

    public LifeCycleBean(){
        log.info("构造");
    }

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

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

    @PreDestroy
    public void destroy(){
        log.info("销毁");
    }
}

MyBeanPostProcessor.java

package com.lucifer.itheima.a03;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.DestructionAwareBeanPostProcessor;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
import org.springframework.stereotype.Component;


@Component
@Slf4j
//执行结果为
//2023-11-06 11:50:39.728  INFO 47300 --- [           main] c.l.itheima.a03.MyBeanPostProcessor      : <<<<<<实例化之前执行,这里返回的对象会替换掉原来的bean
//    2023-11-06 11:50:39.730  INFO 47300 --- [           main] com.lucifer.itheima.a03.LifeCycleBean    : 构造
//    2023-11-06 11:50:39.732  INFO 47300 --- [           main] c.l.itheima.a03.MyBeanPostProcessor      : <<<<<<实例化之后,这里如果返回false会跳过依赖注入阶段
//    2023-11-06 11:50:39.732  INFO 47300 --- [           main] c.l.itheima.a03.MyBeanPostProcessor      : <<<<<<初始化之前执行,这里返回的对象会替换掉原来的bean,如PostConstruct,@ConfigurationProperties
//2023-11-06 11:50:39.732  INFO 47300 --- [           main] com.lucifer.itheima.a03.LifeCycleBean    : 初始化
//    2023-11-06 11:50:39.732  INFO 47300 --- [           main] c.l.itheima.a03.MyBeanPostProcessor      : <<<<<<初始化之后执行,这里返回的对象会替换掉原来的bean,如代理增强
//    2023-11-06 11:50:40.034  INFO 47300 --- [           main] c.l.itheima.a03.MyBeanPostProcessor      : <<<<<<销毁之前执行,如@PreDestroy
//2023-11-06 11:50:40.035  INFO 47300 --- [           main] com.lucifer.itheima.a03.LifeCycleBean    : 销毁
public class MyBeanPostProcessor implements InstantiationAwareBeanPostProcessor, DestructionAwareBeanPostProcessor {

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

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

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

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

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

    @Override
    public Object postProcessAfterInitialization(Object bean,String beanName) throws BeansException{
        if (beanName.equals("lifeCycleBean")){
            log.info("<<<<<<初始化之后执行,这里返回的对象会替换掉原来的bean,如代理增强");
        }
        return bean;
    }
}


模板方法

package com.lucifer.itheima.a03;

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

public class TestMethodTemplate {

    public static void main(String[] args) {
        MyBeanFactory beanFactory = new MyBeanFactory();
        beanFactory.addBeanPostProcessor(bean-> System.out.println("解析 @Autowired"));
        beanFactory.addBeanPostProcessor(bean-> System.out.println("解析 @Resource"));
        beanFactory.getBean();

    }

    // 模板方法 Template Method Pattern
    static class MyBeanFactory {
        public Object getBean() {
            Object bean = new Object();
            System.out.println("构造 "+bean);
            System.out.println("依赖注入 "+ bean); // @Autowired,@Resource
            for (BeanPostProcessor processor : processors) {
                processor.inject(bean);
            }
            System.out.println("初始化 "+bean);
            return bean;
        }

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

        public void addBeanPostProcessor(BeanPostProcessor processor) {
            processors.add(processor);

        }
    }
    static interface BeanPostProcessor{
        public void inject(Object bean); //对依赖注入阶段的扩展
    }

}

相关文章:

  • 51单片机-串口通信
  • 求2个字符串的最短编辑距离 java 实现
  • ChatGPT和API发生重大中断!
  • 面试--springboot基础
  • 跨足泛娱乐:TikTok如何重新定义娱乐产业?
  • 有限域的Fast Multiplication和Modular Reduction算法实现
  • Flink SQL TopN语句详解
  • 【MongoDB-Redis-MySQL-Elasticsearch-Kibana-RabbitMQ-MinIO】Java全栈开发软件一网打尽
  • flutter开发实战-TweenSequence实现动画序列
  • 单通道低压 H 桥电机驱动芯片AT9110H 兼容L9110 马达驱动芯片
  • 达梦数据库答案
  • 勒索病毒最新变种.halo勒索病毒来袭,如何恢复受感染的数据?
  • SwissArmyTransformer瑞士军刀工具箱使用手册
  • 微服务之Eureka
  • 硬件知识1
  • 零代码编程:用ChatGPT批量提取flash动画swf文件中的mp3
  • React:实现一个定时器计数器,每秒自动+1
  • 大语言模型比武
  • 初步了解OSG智能指针
  • 传感器融合是什么?及其类型和应用
  • 三星“七天机”质保期内屏幕漏液被拒保,澎湃介入后已解决
  • 完善劳动关系协商协调机制,《共同保障劳动者合法权益工作指引》发布
  • CBA官方对孙铭徽罚款3万、广厦投资人楼明停赛2场罚款5万
  • 重庆城市轨道交通拟听证调价:公布两套票价方案,正征求意见
  • 私家车跑“顺风”出事故,意外险赔不赔?
  • 国际乒联主席索林:洛杉矶奥运会增设混团是里程碑事件