Spring高级-容器实现-BeanFactory实现的特点
一、DefaultListableBeanFactory
DefaultListableBeanFactory,是 BeanFactory 最重要的实现,像控制反转和依赖注入功能,都是它来实现
1、需求一:往DefaultListableBeanFactory里面 注册一个组件
package com.mangoubiubiu.show; import lombok.extern.slf4j.Slf4j; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.context.annotation.AnnotationConfigUtils; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.logging.Logger; public class { public static void main(String[] args) { DefaultListableBeanFactory beanFactory=new DefaultListableBeanFactory(); //bean 的定义 (class ,scope , 初始化 ,销毁方法) AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(Config.class).setScope("singleton").getBeanDefinition(); beanFactory.registerBeanDefinition("config",beanDefinition); for(String name : beanFactory.getBeanDefinitionNames()){ System.out.println(name); } } @Configuration static class Config{ @Bean public Bean1 bean1(){ return new Bean1(); } @Bean public Bean2 bean2(){ return new Bean2(); } } @Slf4j static class Bean1{ public Bean1(){ log.info("构造 Bean1"); } @Autowired private Bean2 bean2; public Bean2 getBean2(){ return bean2; } } @Slf4j static class Bean2{ public Bean2(){ log.info("构造 Bean2"); } } }
问题:发现仅仅confi注册进来了,config里面的bean没有注册进来
2、解决Config里面的组件注册不进来的问题:为BeanFactory添加一些常用的后处理器,对BeanFactory 做增强处理,来将Config里面的组件也注册在BeanFactory里面
package com.mangoubiubiu.show; import lombok.extern.slf4j.Slf4j; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.context.annotation.AnnotationConfigUtils; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.logging.Logger; public class TestBeanFactory { public static void main(String[] args) { DefaultListableBeanFactory beanFactory=new DefaultListableBeanFactory(); //bean 的定义 (class ,scope , 初始化 ,销毁方法) AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(Config.class).setScope("singleton").getBeanDefinition(); beanFactory.registerBeanDefinition("config",beanDefinition); //给 BeanFactory 添加一些常用的后处理器 AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory); //BeanFactory 后处理器主要功能,补充了一些bean的定义 BeanFactoryPostProcessor把所有Bean工厂的后处理器拿到,逐一执行做扩展 beanFactory.getBeansOfType(BeanFactoryPostProcessor.class).values().stream().forEach(beanFactoryPostProcessor -> { beanFactoryPostProcessor.postProcessBeanFactory(beanFactory); }); for(String name : beanFactory.getBeanDefinitionNames()){ System.out.println(name); } Bean1 bean = beanFactory.getBean(Bean1.class); System.out.println(bean.getBean2()); } @Configuration static class Config{ @Bean public Bean1 bean1(){ return new Bean1(); } @Bean public Bean2 bean2(){ return new Bean2(); } } @Slf4j static class Bean1{ public Bean1(){ log.info("构造 Bean1"); } @Autowired private Bean2 bean2; public Bean2 getBean2(){ return bean2; } } @Slf4j static class Bean2{ public Bean2(){ log.info("构造 Bean2"); } } }
相关Processor作用
org.springframework.context.annotation.internalConfigurationAnnotationProcessor 处理Configuration注解
org.springframework.context.annotation.internalAutowiredAnnotationProcessor 完成对象属性的注入
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
3、解决依赖注入不到的问题:添加一些Bean的后处理器针对 bean 的生命周期的各个阶段提供扩展,例如@Autowired @Resource
package com.mangoubiubiu.show; import lombok.extern.slf4j.Slf4j; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.context.annotation.AnnotationConfigUtils; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.logging.Logger; public class TestBeanFactory { public static void main(String[] args) { DefaultListableBeanFactory beanFactory=new DefaultListableBeanFactory(); //bean 的定义 (class ,scope , 初始化 ,销毁方法) AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(Config.class).setScope("singleton").getBeanDefinition(); beanFactory.registerBeanDefinition("config",beanDefinition); //给 BeanFactory 添加一些常用的后处理器 AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory); //BeanFactory 后处理器主要功能,补充了一些bean的定义 beanFactory.getBeansOfType(BeanFactoryPostProcessor.class).values().stream().forEach(beanFactoryPostProcessor -> { beanFactoryPostProcessor.postProcessBeanFactory(beanFactory); }); //Bean后处理器,针对 bean 的生命周期的各个阶段提供扩展,例如@Autowired @Resource // beanFactory.getBeansOfType(BeanPostProcessor.class).values().forEach(beanFactory::addBeanPostProcessor); beanFactory.getBeansOfType(BeanPostProcessor.class).values().forEach(beanPostProcessor -> { beanFactory.addBeanPostProcessor(beanPostProcessor);//建立bean工厂与后处理器之间的联系 }); for(String name : beanFactory.getBeanDefinitionNames()){ System.out.println(name); } System.out.println("----------------->"); Bean1 bean = beanFactory.getBean(Bean1.class); System.out.println("成功取到Bean2的对象:"+bean.getBean2()); /** * 学到了什么: * a. beanFactory 不会做的事 * 1 。不会主动调用BeanFactory 后处理器 * 2. 不会主动添加Bean后处理器 * 3. 不会主动初始化单列 * 4. 不会解析beanFactory 还不会解析 ${} 与 #{} * * b. bean 后处理器会有排序逻辑 */ } @Configuration static class Config{ @Bean public Bean1 bean1(){ return new Bean1(); } @Bean public Bean2 bean2(){ return new Bean2(); } } @Slf4j static class Bean1{ public Bean1(){ log.info("构造 Bean1"); } @Autowired private Bean2 bean2; public Bean2 getBean2(){ return bean2; } } @Slf4j static class Bean2{ public Bean2(){ log.info("构造 Bean2"); } } }
4、利用beanFactory.preInstantiateSingletons()创建所有的单列对象
5、总结
- a. beanFactory 不会做的事
* 1. 不会主动调用BeanFactory 后处理器
* 2. 不会主动添加Bean后处理器
* 3. 不会主动初始化单列
* 4. 不会解析beanFactory 还不会解析 ${} 与 #{}
本文作者:KwFruit
本文链接:https://www.cnblogs.com/mangoubiubiu/p/16079576.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
Spring
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步