已解决
Spring底层原理学习笔记--第四讲--(常见bean后处理器与@Autowired bean后处理器执行分析)
来自网友在路上 11008100提问 提问时间:2023-11-08 10:07:20阅读次数: 100
最佳答案 问答题库1008位专家为你答疑解惑
常见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();// 用原始方法注册三个beancontext.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();}
}
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;@Autowiredpublic void setBean2(Bean2 bean2) {log.info("@Autowired 生效:{}",bean2);this.bean2 = bean2;}private Bean3 bean3;@Resourcepublic void setBean3(Bean3 bean3) {log.info("@Resource 生效:{}",bean3);this.bean3 = bean3;}public String home;@Autowiredpublic void setHome(@Value("${JAVA_HOME}") String home){log.info("@Value 生效:{}",home);this.home = home;}@PostConstructpublic void init(){log.info("@PostConstruct 生效");}@PreDestroypublic void destroy(){log.info("@PreDestroy 生效");}@Overridepublic String toString() {return "Bean1{" + "bean2=" + bean2 + ", bean3=" + bean3 + ", home='" + home + '\'' + '}';}
}
Bean2.java
package com.lucifer.itheima.a04;public class Bean2 {
}
Bean3.java
package com.lucifer.itheima.a04;public class Bean3 {
}
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;}
}
@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,这称之为InjectionMetadataAutowiredAnnotationBeanPostProcessor 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@18eed359System.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@3c0f93f1System.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.8System.out.println(o2);}
}
查看全文
99%的人还看了
相似问题
- 【2021集创赛】基于arm Cortex-M3处理器与深度学习加速器的实时人脸口罩检测 SoC
- 11. Spring源码篇之实例化前的后置处理器
- 最新Next14 路由处理器 Route Handlers
- Spring底层原理学习笔记--第四讲--(常见bean后处理器与@Autowired bean后处理器执行分析)
- Linux内核分析(六)--处理器调度基本准则和实现介绍
- 【JMeter】后置处理器的分类以及场景介绍
- MTK联发科天玑9000旗舰5G移动平台处理器_MT6983芯片定制开发
- 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
- 简单8位CPU设计verilog微处理器,源码/视频
- PCIe架构的处理器系统介绍
猜你感兴趣
版权申明
本文"Spring底层原理学习笔记--第四讲--(常见bean后处理器与@Autowired bean后处理器执行分析)":http://eshow365.cn/6-35257-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!