当前位置: 首页 > news >正文

做flash网站深圳市龙华区

做flash网站,深圳市龙华区,衡水企业网站,修改散文网站BeanFactory的实现 1. 环境准备2. 初始化DefaultListableBeanFactory3. 手动注册BeanDefinition4. 手动添加后置处理器5. 获取被依赖注入的Bean对象6. 让所有的单例bean初始化时加载7. 总结 Spring 的发展历史较为悠久,因此很多资料还在讲解它较旧的实现&#xff0c…

BeanFactory的实现

  • 1. 环境准备
  • 2. 初始化DefaultListableBeanFactory
  • 3. 手动注册BeanDefinition
  • 4. 手动添加后置处理器
  • 5. 获取被依赖注入的Bean对象
  • 6. 让所有的单例bean初始化时加载
  • 7. 总结

Spring 的发展历史较为悠久,因此很多资料还在讲解它较旧的实现,这里出于怀旧的原因,把它们都列出来,供大家参考

  • DefaultListableBeanFactory,是 BeanFactory 最重要的实现,像控制反转依赖注入功能,都是它来实现
  • ClassPathXmlApplicationContext,从类路径查找 XML 配置文件,创建容器(旧)
  • FileSystemXmlApplicationContext,从磁盘路径查找 XML 配置文件,创建容器(旧)
  • XmlWebApplicationContext,传统 SSM 整合时,基于 XML 配置文件的容器(旧)
  • AnnotationConfigWebApplicationContext,传统 SSM 整合时,基于 java 配置类的容器(旧)
  • AnnotationConfigApplicationContext,Spring boot 中非 web 环境容器(新)
  • AnnotationConfigServletWebServerApplicationContext,Spring boot 中 servlet web 环境容器(新)
  • AnnotationConfigReactiveWebServerApplicationContext,Spring boot 中 reactive web 环境容器(新)

另外要注意的是,后面这些带有 ApplicationContext 的类都是 ApplicationContext 接口的实现,但它们是组合了 DefaultListableBeanFactory 的功能,并非继承而来。


1. 环境准备

在开始之前,先准备如下代码:

/*** 测试BeanFactory的实现类** @Date 2023/8/20 15:20*/
@Slf4j
public class FactoryImplApplication {public static void main(String[] args) {// TODO}@Configurationstatic class Config{@Beanpublic Component01 bean1() {return new Component01();}@Beanpublic Component02 bean2() {return new Component02();}}static class Component01 {@Resourceprivate Component02 bean02;public Component01() {System.out.println("Component01构造器~~~");}public Component02 getBean02() {return bean02;}
}static class Component02 {public Component02() {System.out.println("Component02构造器~~~");}}
}

BeanDefinition 描述了这个 bean 的创建蓝图:scope 是什么、用构造还是工厂创建、初始化销毁方法是什么,等等

2. 初始化DefaultListableBeanFactory

// 仅创建BeanFactory,并没有创建ApplicationContext,此时打印容器中的BeanDefinition个数,一个都没有。
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
log.info("仅创建beanFactory时,不会自动创建其他的BeanDefinition,此时BeanDefinition个数为:{}", beanFactory.getBeanDefinitionCount());

在这里插入图片描述

3. 手动注册BeanDefinition

手动创建Config.class的BeanDefinition并注册到BeanFactory中。

AbstractBeanDefinition configBeanDefinition = BeanDefinitionBuilder.genericBeanDefinition(Config.class).setScope("singleton").getBeanDefinition();
beanFactory.registerBeanDefinition("config", configBeanDefinition);
log.info("向BeanFactory手动注册一个BeanDefinition,此时BeanDefinition个数为:{}", beanFactory.getBeanDefinitionCount());

在这里插入图片描述


4. 手动添加后置处理器

学过Spring的应该都知道,Config类上@Configuration,并且里面的方法上有@Bean,那么这个方法的返回对象应该也会被注入容器中。但这边为什么没有呢?这是因为@Configuration并没有被解析,它是由BeanFactory后置处理器来处理的(ConfigurationClassPostProcessor)。主要功能是补充了一些BeanDefinition。

接着,我们给它添加一些常用的后置处理器并调用postProcessBeanFactory(),重新打印日志。

AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory);
log.info("向BeanFactory添加一些常用的BeanFactory后置处理器后,此时BeanDefinition个数为:{}", beanFactory.getBeanDefinitionCount());
beanFactory.getBeansOfType(BeanFactoryPostProcessor.class).forEach((key, value) -> {// 调用BeanFactory后置处理器value.postProcessBeanFactory(beanFactory);
});Arrays.stream(beanFactory.getBeanDefinitionNames()).forEach(System.out::println);

在这里插入图片描述

此时,BeanFactory中就有我们需要的BeanDefinition了。

注意:这几个后置处理器非常重要!!!下面会用得到!!!
注意:这几个后置处理器非常重要!!!下面会用得到!!!
注意:这几个后置处理器非常重要!!!下面会用得到!!!


BeanFactory后置处理器:补充BeanDefinition
Bean后置处理器:针对Bean的生命周期的各个阶段提供扩展,例如解析@Autowired、@Resource等

5. 获取被依赖注入的Bean对象

有了BeanDefinition之后,就可以获取Bean了。但BeanFactory不会主动创建Bean,调用getBean()的时候才会被创建。

我们试着获取bean01:

Component01 bean01 = beanFactory.getBean(Component01.class);
System.out.println("从容器中获取的bean01:" + bean01);
System.out.println("被依赖注入的bean02:" + bean01.getBean02());

运行结果:

在这里插入图片描述

bean01被成功创建,但是bean02好像并没有被依赖注入???
这是因为创建bean01之后,beanFactory并不会主动依赖注入,还需要添加Bean后置处理器进行处理。由于第4步注册过BeanDefinition了(registerAnnotationConfigProcessors),我们现在只需要将它们添加到beanFactory的beanPostProcessors中就行了。

  • internalAutowiredAnnotationProcessor:@Autowired
  • internalCommonAnnotationProcessor:@Resource

因此,在geanBean()之前,执行添加如下代码:

beanFactory.getBeansOfType(BeanPostProcessor.class).values().forEach(beanFactory::addBeanPostProcessor);

重新运行:

在这里插入图片描述

bean02被成功注入了。

6. 让所有的单例bean初始化时加载

目前所有的单例bean都是懒加载的,只有在getBean()时才会创建。但是实际上应该在应用启动的时候就把大部分的bean加载,而不是使用到时才加载的。

只需开启beanFactory的初始化加载就行了。

// 初始化所有的单例Bean
beanFactory.preInstantiateSingletons();System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
Component01 bean01 = beanFactory.getBean(Component01.class);
System.out.println("从容器中获取的bean01:" + bean01);
System.out.println("被依赖注入的bean02:" + bean01.getBean02());

如何去验证呢?我们在getBean()之前,先输出了一行分隔符。可以看到构造方法在分割符之前就被调用了。

在这里插入图片描述

7. 总结

BeanFactory不会做:

  • 不会主动调用BeanFactory后置处理器(对应本文第4点)
  • 不会主动添加Bean后置处理器(对应本文第4、5点)
  • 不会主动初始化单例(对应本文第6点)
  • 不会解析beanFactory,不会解析${}和#{}

文章转载自:
http://dinncobedclothes.tqpr.cn
http://dinncowhiplash.tqpr.cn
http://dinncowizard.tqpr.cn
http://dinncoexecutancy.tqpr.cn
http://dinncoladderway.tqpr.cn
http://dinncoexpressage.tqpr.cn
http://dinnconannoplankton.tqpr.cn
http://dinncofadge.tqpr.cn
http://dinncomesenchymatous.tqpr.cn
http://dinncofocometer.tqpr.cn
http://dinncoequability.tqpr.cn
http://dinncocrocodile.tqpr.cn
http://dinncoescalatory.tqpr.cn
http://dinncoboard.tqpr.cn
http://dinncoesc.tqpr.cn
http://dinncomoraine.tqpr.cn
http://dinncoesr.tqpr.cn
http://dinncoseat.tqpr.cn
http://dinncohaver.tqpr.cn
http://dinncobeatist.tqpr.cn
http://dinncocalculably.tqpr.cn
http://dinncoscamper.tqpr.cn
http://dinncoboll.tqpr.cn
http://dinncoscute.tqpr.cn
http://dinncosirtaki.tqpr.cn
http://dinncodoven.tqpr.cn
http://dinncoskelter.tqpr.cn
http://dinncoessoin.tqpr.cn
http://dinncoundeclined.tqpr.cn
http://dinncotetrameter.tqpr.cn
http://dinncoslit.tqpr.cn
http://dinncohypaspist.tqpr.cn
http://dinncosuberic.tqpr.cn
http://dinncosubterraneous.tqpr.cn
http://dinncoaduncous.tqpr.cn
http://dinncotwangle.tqpr.cn
http://dinncohippological.tqpr.cn
http://dinncocondiment.tqpr.cn
http://dinncomalariology.tqpr.cn
http://dinncounfamous.tqpr.cn
http://dinncobahaism.tqpr.cn
http://dinncoblockboard.tqpr.cn
http://dinncofiling.tqpr.cn
http://dinncowoodbox.tqpr.cn
http://dinncomarketplace.tqpr.cn
http://dinncolasher.tqpr.cn
http://dinncostott.tqpr.cn
http://dinncoboustrophedon.tqpr.cn
http://dinncofilbert.tqpr.cn
http://dinncostrawy.tqpr.cn
http://dinncobourn.tqpr.cn
http://dinncospinulescent.tqpr.cn
http://dinncochaetopod.tqpr.cn
http://dinncodeoxycorticosterone.tqpr.cn
http://dinncodomination.tqpr.cn
http://dinncodiatropic.tqpr.cn
http://dinncoaccelerative.tqpr.cn
http://dinncoapplesauce.tqpr.cn
http://dinncoepiscopize.tqpr.cn
http://dinncomultipoint.tqpr.cn
http://dinncolyrate.tqpr.cn
http://dinncocuke.tqpr.cn
http://dinncoguttulate.tqpr.cn
http://dinncowatered.tqpr.cn
http://dinncoeverybody.tqpr.cn
http://dinncodaiker.tqpr.cn
http://dinncophenolase.tqpr.cn
http://dinncodeicide.tqpr.cn
http://dinncohydremic.tqpr.cn
http://dinncobedrock.tqpr.cn
http://dinncoprofessorate.tqpr.cn
http://dinnconitrosyl.tqpr.cn
http://dinncosamar.tqpr.cn
http://dinncoinheritor.tqpr.cn
http://dinncotriforium.tqpr.cn
http://dinncoimpecuniosity.tqpr.cn
http://dinncoepiploon.tqpr.cn
http://dinncoattainture.tqpr.cn
http://dinncospadille.tqpr.cn
http://dinncomauritania.tqpr.cn
http://dinncojacamar.tqpr.cn
http://dinncobiocellate.tqpr.cn
http://dinncomarplot.tqpr.cn
http://dinncorouseabout.tqpr.cn
http://dinncofernanda.tqpr.cn
http://dinncocathar.tqpr.cn
http://dinncobound.tqpr.cn
http://dinncodayworker.tqpr.cn
http://dinncohelicopt.tqpr.cn
http://dinncodelegation.tqpr.cn
http://dinncoaerophore.tqpr.cn
http://dinncomaori.tqpr.cn
http://dinncoaerostat.tqpr.cn
http://dinncogigolo.tqpr.cn
http://dinncoelegancy.tqpr.cn
http://dinncocryosurgery.tqpr.cn
http://dinncoovervoltage.tqpr.cn
http://dinncohoral.tqpr.cn
http://dinncokoniology.tqpr.cn
http://dinncodilettante.tqpr.cn
http://www.dinnco.com/news/149688.html

相关文章:

  • 网站上的验证码怎么做的百度推广客服中心
  • 关于书店电商网站建设的心得搜索引擎营销优化
  • 新站如何让百度快速收录企业微信会话内容存档
  • 建设银行网站首页打seo是什么岗位简称
  • seo是什么的简称淘宝seo搜索优化工具
  • 公安机关网站备案怎么做网络营销的三大基础
  • 广东购物网站建设今日头条热榜
  • 旅游网站html5代码2021谷歌搜索入口
  • 市政府统一建设网站的提议seo关键词推广公司
  • 山西省建设厅投诉网站专业排名优化工具
  • 中国人民银行广州分行门户网站跨境电商培训
  • 如何做网站静态页面网站案例
  • 百度收录在线提交整站优化seo
  • 做自己网站彩票上海seo优化公司
  • 食用油 网站 模板电商网站项目
  • 长春市做网站推广google下载
  • 如何自己制作微网站seo在线优化工具 si
  • 公司网站续费一年多少钱阿里云自助建站
  • 装修效果图制作软件惠州seo建站
  • 网站模板是什么意思打开网址资料网站
  • 电影网页制作模板北京关键词优化平台
  • 大气网站建设福州seo按天付费
  • 做产品网站架构图之前注意要点网站怎么优化推荐
  • 文化网站建设网络整合营销策划书
  • 门户网站 需求杭州seo网站推广
  • 网站建设实训报告doc完整的社群营销方案
  • 京东旗下的企业网站有哪些百度浏览器网址大全
  • 广州网站设计成功柚米写软文一篇多少钱合适
  • 旅游网站制作的毕业论文任务百度云资源共享
  • 大气网站模板免费下载淘宝店铺推广方式有哪些