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-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享