温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何初始化容器与DefaultListableBeanFactory

发布时间:2021-10-23 10:20:14 来源:亿速云 阅读:213 作者:iii 栏目:web开发

本篇内容介绍了“如何初始化容器与DefaultListableBeanFactory”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1入口

从 JavaConfig 中加载配置的 AnnotationConfigApplicationContext 启动方式如下:

如何初始化容器与DefaultListableBeanFactory

进去之后发现构造其实是调用的当前无参构造。

如何初始化容器与DefaultListableBeanFactory

所以在启动时也可以直接声明无参构造,改写为下面这种:

public class AnnotationConfigApplicationTest {   public static void main(String[] args) {    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();    context.register(JavaConfig.class);   context.refresh();    System.out.println(context.getBean(UserComponent.class));   } }

今天就研究研究无参构造这一部分究竟做了什么逻辑!

无参构造

如何初始化容器与DefaultListableBeanFactory

其中的 StartupStep 是 5.3 新增的类,看代码注释的意思是:表示用来记录启动过程中的一些指标信息等。暂时不做研究。

主要研究红框部分!注意,这一块并不代表只有红框部分!

如何初始化容器与DefaultListableBeanFactory

因为 AnnotationConfigApplicationContext  继承了GenericApplicationContext,所以会先执行父类的构造方法。

如何初始化容器与DefaultListableBeanFactory

所以这里会创建一个 DefaultListableBeanFactory 的容器。

DefaultListableBeanFactory

如何初始化容器与DefaultListableBeanFactory


DefaultListableBeanFactory UML

虽然说 Spring 的 BeanFactory 定义了容器的基础概念、接口方法等,但是 DefaultListableBeanFactory  才是一个真正可以 new 出来的具体的容器,当然也可以暂且称之为 bean 工厂。

下面来看一下 DefaultListableBeanFactory 里面都有什么?

如何初始化容器与DefaultListableBeanFactory

在 DefaultListableBeanFactory 里面会初始化很多参数,其中重点关注的是下面两个参数:

/** Map of bean definition objects, keyed by bean name. */ // BeanDefinition 的存储 Map 其中 key 为 beanName private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);  /** List of bean definition names, in registration order. */ // BeanName 的集合 private volatile List<String> beanDefinitionNames = new ArrayList<>(256);

其中 BeanDefinition 描述了一个 bean 实例,该实例具有属性值,构造函数参数值以及具体实现所提供的更多信息。

对应的 beanDefinitionMap 就是存储的初始化的 beanName 和 BeanDefinition。

至于 BeanDefinition 具体内容,下一节再做介绍。

2.总结

通过上面的阅读,可以在初始化流程中增加一部分模块,即实例化 DefaultListableBeanFactory

如何初始化容器与DefaultListableBeanFactory

再回顾一下 DefaultListableBeanFactory 的概念。

ConfigurableListableBeanFactory 和 BeanDefinitionRegistry  接口的默认实现:基于bean定义元数据的成熟bean工厂,可通过后处理器进行扩展。重点需要把握的是 DefaultListableBeanFactory  内部定义了 BeanDefinition 的 Map。

“如何初始化容器与DefaultListableBeanFactory”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI