欢迎访问 生活随笔!

凯发ag旗舰厅登录网址下载

当前位置: 凯发ag旗舰厅登录网址下载 > 前端技术 > javascript >内容正文

javascript

spring容器初始化和bean创建过程 -凯发ag旗舰厅登录网址下载

发布时间:2025/1/21 javascript 16 豆豆
凯发ag旗舰厅登录网址下载 收集整理的这篇文章主要介绍了 spring容器初始化和bean创建过程 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

文章目录

    • spring容器初始化过程(注解)
      • 1.this() 初始化bean读取器和扫描器
      • 2. register(annotatedclasses)
      • 3 refresh()刷新上下文

前言:一直想详细了解下spring容器初始化和bean创建过程,今天抽空通过翻阅各种资料,对spring容器初始化和bean的创建有了大概了解。

spring容器初始化过程(注解)

以annotationconfigapplicationcontext为例:
查看继承图:


从annotationconfigapplicationcontext源码分析

applicationcontext applicationcontext = new annotationconfigapplicationcontext(userconfig.class);

annotationconfigapplicationcontex主要代码

public annotationconfigapplicationcontext(class... annotatedclasses) {this(); //2.注册bean配置类this.register(annotatedclasses); //3.刷新上下文this.refresh();}

1.this() 初始化bean读取器和扫描器

public annotationconfigapplicationcontext() {//在ioc容器中初始化一个 注解bean读取器annotatedbeandefinitionreaderthis.reader = new annotatedbeandefinitionreader(this);//在ioc容器中初始化一个 按类路径扫描注解bean的 扫描器this.scanner = new classpathbeandefinitionscanner(this);}

2. register(annotatedclasses)

注册bean配置类, annotationconfigapplicationcontext容器通过annotatedbeandefinitionreader的registerbean方法实现注解bean的读取,具体源码如下:annotationconfigapplicationcontext.java中register方法

public void registerbean(class<?> annotatedclass) {doregisterbean(annotatedclass, null, null, null);}<t> void doregisterbean(class<t> annotatedclass, @nullable supplier<t> instancesupplier, @nullable string name,@nullable class<? extends annotation>[] qualifiers, beandefinitioncustomizer... definitioncustomizers) {//将bean配置类信息转成容器中annotatedgenericbeandefinition数据结构, annotatedgenericbeandefinition继承//自beandefinition作用是定义一个bean的数据结构,下面的getmetadata可以获取到该bean上的注解信息annotatedgenericbeandefinition abd = new annotatedgenericbeandefinition(annotatedclass);//@conditional装配条件判断是否需要跳过注册if (this.conditionevaluator.shouldskip(abd.getmetadata())) {return;}abd.setinstancesupplier(instancesupplier);//解析bean作用域(单例或者原型),如果有@scope注解,则解析@scope,没有则默认为singletonscopemetadata scopemetadata = this.scopemetadataresolver.resolvescopemetadata(abd);//作用域写回beandefinition数据结构, abd中缺损的情况下为空,将默认值singleton重新赋值到abdabd.setscope(scopemetadata.getscopename());//生成bean配置类beannamestring beanname = (name != null ? name : this.beannamegenerator.generatebeanname(abd, this.registry));//通用注解解析到abd结构中,主要是处理lazy, primary dependson, role ,description这五个注解annotationconfigutils.processcommondefinitionannotations(abd);if (qualifiers != null) {for (class<? extends annotation> qualifier : qualifiers) {//如果配置@primary注解,则设置当前bean为自动装配autowire时首选beanif (primary.class == qualifier) {abd.setprimary(true);}//设置当前bean为延迟加载else if (lazy.class == qualifier) {abd.setlazyinit(true);}//其他注解,则添加到abd结构中else {abd.addqualifier(new autowirecandidatequalifier(qualifier));}}}for (beandefinitioncustomizer customizer : definitioncustomizers) {customizer.customize(abd);} //根据beanname和bean定义信息封装一个beandefinitionholder,其实就是一个 beanname和beandefinition的映射 beandefinitionholder definitionholder = new beandefinitionholder(abd, beanname);//创建代理对象 借助annotationconfigutils工具类解析通用注解definitionholder = annotationconfigutils.applyscopedproxymode(scopemetadata, definitionholder, this.registry);// new concurrenthashmap(256);用于保存注bean定义信息(beanname 和 beandefine映射)注册到ioc容器中beandefinitionreaderutils.registerbeandefinition(definitionholder, this.registry);}

目的:完成bean配置类本身的解析和注册。将其以键值对的形式保存到ioc容器中。

3 refresh()刷新上下文

public void refresh() throws beansexception, illegalstateexception {synchronized (this.startupshutdownmonitor) {// 1.刷新前的预处理preparerefresh();// 2.获取刷新后的内部bean工厂configurablelistablebeanfactory beanfactory = obtainfreshbeanfactory();//3.beanfactory的预准备工作preparebeanfactory(beanfactory);try {// beanfactory准备工作完成后,可以做一些后置处理工作//4.空方法,用于在容器的子类中扩展postprocessbeanfactory(beanfactory);// 5. 执行beanfactorypostprocessor的方法,beanfactory的后置处理器//在beanfactory标准初始化之后执行的invokebeanfactorypostprocessors(beanfactory);// 6. 注册beanpostprocessor(bean的后置处理器),用于拦截bean创建过程registerbeanpostprocessors(beanfactory);// 7. 初始化messagesource组件(做国际化功能;消息绑定,消息解析).initmessagesource();// 8. 初始化事件派发器initapplicationeventmulticaster();//9.可以用于子类实现在容器刷新时自定义逻辑初始化onrefresh();// 10. 注册时间监听器,将applicationlistener注册到容器中来registerlisteners();// 11. 初始化所有剩下的单实例bean,单例bean在初始化容器时创建,懒加载在调用的时候创建finishbeanfactoryinitialization(beanfactory);//12. 完成beanfactory的初始化创建工作,ioc容器就创建完成finishrefresh();}catch (beansexception ex) {if (logger.iswarnenabled()) {logger.warn("exception encountered during context initialization - " "cancelling refresh attempt: " ex);}// destroy already created singletons to avoid dangling resources.destroybeans();// reset 'active' flag.cancelrefresh(ex);// propagate exception to caller.throw ex;}finally {// reset common introspection caches in spring's core, since we// might not ever need metadata for singleton beans anymore...resetcommoncaches();}}}

refresh刷新上下文字方法1到12,bean的创建过程在第11个方法。具体bean的创建方法我们可以参考这篇文章spring|容器初始化流程及源码分析

总结

以上是凯发ag旗舰厅登录网址下载为你收集整理的spring容器初始化和bean创建过程的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发ag旗舰厅登录网址下载网站内容还不错,欢迎将凯发ag旗舰厅登录网址下载推荐给好友。

  • 上一篇:
  • 下一篇:
网站地图