BeanFactory与ApplicationContext的实现
2022/3/31 6:21:02
本文主要是介绍BeanFactory与ApplicationContext的实现,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
本文为学习笔记
BeanFactory和ApplicationContext 的实现
1、@Bean注解是BeanFactory 的后处理器的Buff 2、@AutoWire、@Resource是Bean的后处理器,bean 的后处理器是针对Bean的生命周期的扩展 3、beanFactory默认情况下读到@bean、@autowired 是不会创建对象的,而只是保留一个名字,getBean()时才会创建对象。可以使用beanfactory.preInstantiateSignletons()来初始化单例对象 4、不会主动解析 ${} 和 #{}
1、BeanFactory 的实现
1、最重要的实现:DefaultListBeanFactory 要创建bean,首先要定义Bean,(class、scope(单例、多例)、初始化、销毁等信息) 2、首先使用BeanDefinitionBuilder.genericBeanDefinition(Config.class).setScope("singleton").getBeanDefinition()创建一个单例的Config beanDefinition 。在使用Beanfactory 创建一个指定名字和Beanfinition 的类。注意:BeanFactory默认情况下不会读取注解,即不会创建Config 里面的@Bean声明的对象 3、解决BeanFactory 不能做到的事: AnnotationConfigUtils.registerAnnotationConfigProfessor 添加后处理器
源码:
public class TestConfig { public static void main(String[] args) { //创建工厂,之前说过这个类可以创建众多类型的 Bean 如何实现: DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); //创建类的定义 AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(MyConfig.class).setScope("singleton").getBeanDefinition(); //把类的定义交给工厂创建一个 bean :config beanFactory.registerBeanDefinition("config",beanDefinition); //遍历:在这里还没有给 beanFactory 加Buff 它只能创建config 而不能创建 bean1 和 bean2 System.out.println("解析之前=================================="); for (int i = 0; i < beanFactory.getBeanDefinitionNames().length; i++) { System.out.println(beanFactory.getBeanDefinitionNames()[i]); } //给 beanFactory 加一些后处理器 AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory); //使这些处理器生效,根据type 获取后处理器 依次执行 beanFactory.getBeansOfType(BeanFactoryPostProcessor.class).values().stream().forEach((pro->{ pro.postProcessBeanFactory(beanFactory); })); System.out.println("解析之后=================================="); for (int i = 0; i < beanFactory.getBeanDefinitionNames().length; i++) { System.out.println(beanFactory.getBeanDefinitionNames()[i]); } //添加Bean的后处理器,使 @autowired 、@resource 生效 beanFactory.getBeansOfType(BeanPostProcessor.class).values().forEach(beanFactory::addBeanPostProcessor); //调用 getBean()之前 beanFactory.preInstantiateSingletons(); System.out.println("调用 getBean()之前>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); System.out.println(beanFactory.getBean(Bean1.class).getBean2()); } @Configuration static class MyConfig{ @Bean public Bean1 bean1(){ return new Bean1(); } @Bean public Bean2 bean2(){ return new Bean2(); } } static class Bean1{ private Logger logger = LoggerFactory.getLogger(Bean1.class); public Bean1(){ logger.debug("bean1 create ---"); } @Autowired private Bean2 bean2; public Bean2 getBean2(){return bean2;}; } static class Bean2{ private Logger logger = LoggerFactory.getLogger(Bean2.class); public Bean2(){ logger.debug("bean2 create ---"); } } }
结果:
1、添加BeanFactoryPostProcessor
2、添加BeanPostProcessor
3、添加preInstantiateSignletons()
这篇关于BeanFactory与ApplicationContext的实现的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15PingCAP 黄东旭参与 CCF 秀湖会议,共探开源教育未来
- 2024-05-13PingCAP 戴涛:构建面向未来的金融核心系统
- 2024-05-09flutter3.x_macos桌面os实战
- 2024-05-09Rust中的并发性:Sync 和 Send Traits
- 2024-05-08使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B
- 2024-05-08完工标准(DoD)与验收条件(AC)究竟有什么不同?
- 2024-05-084万 star 的 NocoDB 在 sealos 上一键起,轻松把数据库编程智能表格
- 2024-05-08Mac 版Stable Diffusion WebUI的安装
- 2024-05-08解锁CodeGeeX智能问答中3项独有的隐藏技能
- 2024-05-08RAG算法优化+新增代码仓库支持,CodeGeeX的@repo功能效果提升