• Spring底层原理学习笔记--第四讲--(常见bean后处理器与@Autowired bean后处理器执行分析)


    常见bean后处理器

    A04Application.java

    package com.lucifer.itheima.a04;
    
    import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor;
    import org.springframework.context.annotation.CommonAnnotationBeanPostProcessor;
    import org.springframework.context.annotation.ContextAnnotationAutowireCandidateResolver;
    import org.springframework.context.support.GenericApplicationContext;
    
    
    public class A04Application {
        public static void main(String[] args) {
            // GenericApplicationContext 是一个【干净】的容器
            GenericApplicationContext context = new GenericApplicationContext();
    
            // 用原始方法注册三个bean
            context.registerBean("bean1",Bean1.class);
            context.registerBean("bean2",Bean2.class);
            context.registerBean("bean3",Bean3.class);
    //        context.registerBean("bean4",Bean4.class);
    
    
            //        输出结果为
    //        15:43:48.956 [main] INFO com.lucifer.itheima.a04.Bean1 - @Value 生效
    //        15:43:48.963 [main] INFO com.lucifer.itheima.a04.Bean1 - @Autowired 生效
            context.getDefaultListableBeanFactory().setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
            context.registerBean(AutowiredAnnotationBeanPostProcessor.class);  //处理@Autowired @Value注解的依赖注入
    
            // 输出结果为
    //        16:04:48.955 [main] INFO com.lucifer.itheima.a04.Bean1 - @Resource 生效:com.lucifer.itheima.a04.Bean3@6ee52dcd
    //        16:04:48.956 [main] INFO com.lucifer.itheima.a04.Bean1 - @PostConstruct 生效
    //        16:04:48.967 [main] INFO com.lucifer.itheima.a04.Bean1 - @PreDestroy 生效
            context.registerBean(CommonAnnotationBeanPostProcessor.class);  //处理@Resource @PostConstruct @PreDestroy的依赖注入
    
    //        ConfigurationPropertiesBindingPostProcessor.register(context.getDefaultListableBeanFactory()); //处理@ConfigurationProperties的依赖注入
            // 初始化容器
            context.refresh();  // 执行beanFactory后处理器,添加bean后处理器,初始化所有单例
    
            System.out.println(context.getBean(Bean4.class));
            // 销毁容器
            context.close();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    Bean1.java

    package com.lucifer.itheima.a04;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    
    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    import javax.annotation.Resource;
    
    
    @Slf4j
    public class Bean1 {
    
        private Bean2 bean2;
    
        @Autowired
        public void setBean2(Bean2 bean2) {
            log.info("@Autowired 生效:{}",bean2);
            this.bean2 = bean2;
        }
    
        private Bean3 bean3;
    
        @Resource
        public void setBean3(Bean3 bean3) {
            log.info("@Resource 生效:{}",bean3);
            this.bean3 = bean3;
        }
    
        public String home;
    
        @Autowired
        public void setHome(@Value("${JAVA_HOME}") String home){
            log.info("@Value 生效:{}",home);
            this.home = home;
        }
    
        @PostConstruct
        public void init(){
            log.info("@PostConstruct 生效");
        }
    
        @PreDestroy
        public void destroy(){
            log.info("@PreDestroy 生效");
        }
    
        @Override
        public String toString() {
            return "Bean1{" + "bean2=" + bean2 + ", bean3=" + bean3 + ", home='" + home + '\'' + '}';
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    Bean2.java

    package com.lucifer.itheima.a04;
    
    
    public class Bean2 {
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Bean3.java

    package com.lucifer.itheima.a04;
    
    
    public class Bean3 {
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Bean4.java

    package com.lucifer.itheima.a04;
    
    import org.springframework.boot.context.properties.ConfigurationProperties;
    
    
    /*
        java.home=
        java.version=
     */
    
    @ConfigurationProperties(prefix = "java")
    public class Bean4 {
    
        private String home;
    
        private String version;
    
        public String getHome(){
            return home;
        }
    
        public void setHome(){
            this.home=home;
        }
    
        public String getVersion(){
            return version;
        }
    
        public void setVersion(){
            this.version=version;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    @Autowired bean后处理器执行分析

    package com.lucifer.itheima.a04;
    
    import org.springframework.beans.PropertyValues;
    import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor;
    import org.springframework.beans.factory.annotation.InjectionMetadata;
    import org.springframework.beans.factory.config.DependencyDescriptor;
    import org.springframework.beans.factory.support.DefaultListableBeanFactory;
    import org.springframework.context.annotation.ContextAnnotationAutowireCandidateResolver;
    import org.springframework.core.MethodParameter;
    import org.springframework.core.env.StandardEnvironment;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    //AutowiredAnnotationBeanPostProcessor 运行分析
    public class DigInAutowired {
        public static void main(String[] args) throws Throwable{
            DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
            beanFactory.registerSingleton("bean2",new Bean2()); //创建过程,依赖注入,初始化
            beanFactory.registerSingleton("bean3",new Bean3());
            beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver()); //解析@Value注解
            beanFactory.addEmbeddedValueResolver(new StandardEnvironment()::resolvePlaceholders); //${}的解析器
    
            //1.查找哪些属性、方法加了@Autowired,这称之为InjectionMetadata
            AutowiredAnnotationBeanPostProcessor processor = new AutowiredAnnotationBeanPostProcessor();
            processor.setBeanFactory(beanFactory);
    
            Bean1 bean1 = new Bean1();
            // 执行结果为
            //Bean1{bean2=null, bean3=null, home='null'}
    //        System.out.println(bean1);
            processor.postProcessProperties(null,bean1,"bean1");  //执行依赖注入@Autowired @Value
            //执行结果为
            //17:23:33.456 [main] INFO com.lucifer.itheima.a04.Bean1 - @Autowired 生效:com.lucifer.itheima.a04.Bean2@6fd02e5
            //17:23:33.464 [main] INFO com.lucifer.itheima.a04.Bean1 - @Value 生效:${JAVA_HOME}
            //Bean1{bean2=com.lucifer.itheima.a04.Bean2@6fd02e5, bean3=null, home='${JAVA_HOME}'}
    //        System.out.println(bean1);
    
            Method findAutowiringMetadata = AutowiredAnnotationBeanPostProcessor.class.getDeclaredMethod(
                "findAutowiringMetadata", String.class, Class.class, PropertyValues.class);
            findAutowiringMetadata.setAccessible(true);
            InjectionMetadata metadata = (InjectionMetadata) findAutowiringMetadata.invoke(processor, "bean1",
                                                                                           Bean1.class, null);//获取Bean1
            // 上加了@Value @Autowired的成员变量,方法参数信息
            System.out.println(metadata);
    
            //2.调用InjectionMetadata,来进行依赖注入,注入时按类型查找值
            metadata.inject(bean1,"bean1",null);
    
            //输出结果为
            //Bean1{bean2=com.lucifer.itheima.a04.Bean2@3c0f93f1, bean3=null, home='E:\JDKg\jdk1.8'}
            System.out.println(bean1);
    
            //3.如何按类型查找值
            Field bean3 = Bean1.class.getDeclaredField("bean3");
            DependencyDescriptor dd1 = new DependencyDescriptor(bean3,false);
            Object o = beanFactory.doResolveDependency(dd1,null,null,null);
            //输出结果为
            //com.lucifer.itheima.a04.Bean3@18eed359
            System.out.println(o);
    
            Method setBean2 = Bean1.class.getDeclaredMethod("setBean2", Bean2.class);
            DependencyDescriptor dd2 = new DependencyDescriptor(new MethodParameter(setBean2,0),false);
            beanFactory.doResolveDependency(dd2,null,null,null);
            Object o1 = beanFactory.doResolveDependency(dd2,null,null,null);
            // 输出结果为
            //com.lucifer.itheima.a04.Bean2@3c0f93f1
            System.out.println(o1);
    
            Method setHome = Bean1.class.getDeclaredMethod("setHome", String.class);
            DependencyDescriptor dd3 = new DependencyDescriptor(new MethodParameter(setHome,0),true);
            Object o2 = beanFactory.doResolveDependency(dd3,null,null,null);
            // 输出结果为
            //E:\JDK\jdk1.8
            System.out.println(o2);
    
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
  • 相关阅读:
    tiup dm audit
    吴恩达深度学习笔记(六)——超参数调试、Batch正则化和程序框架
    【病害识别】基于matlab随机森林苹果病害识别【含Matlab源码 2211期】
    用Hugging Face Transformers,高效部署:多显卡量化感知训练并转换为ONNX格式的多标签分类模型
    血糖老控制不好,是不是因为以下的原因
    探索有趣的微观世界:微生物的种类、生存、应用
    innovus: clock cell spacing如何设置?
    深度学习(十)——神经网络:非线性激活
    山东企业应该做的体系认证
    金仓数据库 KingbaseES插件参考手册(16. dbms_lob)
  • 原文地址:https://blog.csdn.net/weixin_42594143/article/details/134266948