本文主要是介绍品Spring:负责bean定义注册的两个“排头兵”,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
别看Spring现在玩的这么花,其实它的“筹码”就两个,“容器”和“bean定义”。
只有先把bean定义注册到容器里,后续的一切可能才有可能成为可能。
所以在进阶的路上如果要想走的顺畅些,彻底搞清楚bean定义注册的所有细节至关重要。
毕竟这是万里长征的第一步。有句话怎么说来着,“勿在浮沙筑高台”。
Spring步入注解和Java配置的时代也有些时日了。而且也旗帜鲜明的表达了bean的注册方法。
这不,就是这个接口,AnnotationConfigRegistry,如下图01:
再来看下这个接口的名字,有三个单词组成,Annotation、Config、Registry。
第一个表示注解,第二个表示Java配置,第三个表示注册。
合起来的意思可以理解为,基于注解和Java配置的bean定义注册。当然,这是我猜的,哈哈哈。
这是一个很牛X的接口,理由见下图02:
纳尼,所有的容器类都实现了它。
不管是web的、非web的,传统Spring的、SpringBoot的,响应式的、Servlet的。
简直是老少通吃、妇孺皆宜啊。淡定、淡定。
这个接口的两个方法非常简约:
一个是直接把一个类(Class<?>)进行注册。
一个是通过扫描指定的包(Package)里的类进行注册。
请注意我刚刚使用了“简约”而没有使用“简单”,因为简约往往并不等于简单,反而更多时候等于难。
讲了这么多,终于可以让今天的主角登场了,来来来,掌声响起来。
就是这两个类:
AnnotatedBeanDefinitionReader
ClassPathBeanDefinitionScanner
第一个类就是站在接口第一个方法register背后默默付出的。
第二个类就是负责搞定接口第二个方法scan后面所有事情的。
下面开始进行具体的讲解,只需要知道都干了什么即可,至于怎么干的,不需要了解。
看第一个类,如下图03:
第一个字段类型是BeanDefinitionRegistry,这是容器(或bean factory)会实现的接口。
用于把一个BeanDefinition(bean定义)注册到容器中,看下它的这个方法,如下图04:
编程新说注:对“bean定义”这个概念不清楚的,可以在文末查看本系列《品Spring》文章的头几篇。
刚刚应该看到在注册bean定义时需要一个bean名称(即beanName),因此该第二个字段发挥作用了。
它就是BeanNameGenerator。例如,有一个类是UserController,它上面标了注解@Controller("user")。
首先它会把注解的value属性作为名称,此时就是user啦。
如果没有指定value属性,就像这样@Controller,此时就是类的短名称且首字母小写,即userController。
这就是bean名称的生成策略,在实际开发中不就是这样的嘛。
这篇关于品Spring:负责bean定义注册的两个“排头兵”的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!