Spring在实例化之前,做了一件事,那就是向容器中注册BeanDefinitions,因为后面的实例化就是实例化这些BeanDefinitions所描述的类.
从名字上我们也可以知道,BeanDefinitions就是Bean的定义描述信息.
而我们日常开发中都是接触的
<bean id="" class="" />
<context:component-scan base-package="" />
<aop:aspectj-autoproxy proxy-target-class="true" />
这些配置标签其实是由指定的Parser解析器去解析成BeanDefinitions,
比如component-scan标签,对应着唯一的一个Parser解析器.
那么这些Parser又是哪里来的呢?
在spring-beans,spring-context等Spring的大部分模块下,META-INF/目录下,都有一个spring.handlers文件,像阿里的Dubbo模块下也有spring.handlers文件.
这些文件都是以key-value存储内容.
Spring在启动之后,会读取spring.handlers文件,将里面的内容存储起来,也会实例化里面的类.
![](https://img.haomeiwen.com/i7779174/e88ef81cf8dfb5a8.png)
比如我们拿截图中的第一个org.springframework.context.config.ContextNamespaceHandler类来说,在它实例化之后,会注册很多Parser解析器.
![](https://img.haomeiwen.com/i7779174/7d4017b2fe60c0b6.png)
比如截图里面的component-scan标签就有一个唯一对应的ComponentScanBeanDefinitionParser解析器.
等Spring拥有了这些解析器之后,它就会解析读懂我们在配置文件中配置的内容了.
这些解析器就是翻译官,将配置文件中配置的内容,翻译成对应的BeanDefinition,
然后Spring根据BeanDefinitions信息就可以实例化对象了.
个人站点: https://www.infuq.com/
公众号: Netty历险记
网友评论