-
xml 标签解析
DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions()
-
xml系统标签和自定义标签解析
DefaultBeanDefinitionDocumentReader.parseBeanDefinitions()
<bean/> 这种为系统标签,使用parseDefaultElement()方法解析。
<context:component-scan base-package="xxx"/> 这种为自定义标签,使用parseCustomElement()方式解析
自定义标签解析
处理需要命名空间解析器,和命名空间处理器。
命名空间解析器NamespaceHandlerResolver,这一般只有一个实现类DefaultNamespaceHandlerResolver。
-
命名空间处理器 NamespaceHandler, 需要自定义处理器,解析自定义标签。
比如MvcNamespaceHandler,初始化的时候定义标签及解析器。
-
找标签对应的处理器
elasticsearch 扫描接口生成 beanDefinition 过程
解析标签
<elasticsearch:repositories base-package="com.ymm.trade.es.repository"/>
-
找到 scheme 的处理器
-
解析 标签 elasticsearch:repositories
RepositoryBeanDefinitionParser.parse()
第二个框中,生成了所有接口的 BeanDefinition,完成了配置到bean定义过程。
-
生成 beanDefinition
这里的beanDefinition只是半成品,还没有生成完。
ClassPathScanningCandidateComponentProvider.findCandidateComponents()
追到最后,发现直接扫描包下面的接口文件,获取接口文件类信息,并生成对应beanDefinition,后面再添加其他属性。没发现使用注解生成bean,一开始以为使用注解定义bean的。。。
-
处理注解信息,这里注解只是增强功能,没有过滤功能
RepositoryComponentProvider.findCandidateComponents()
-
根据之前的beanDefinition,生成需要的beanDefinition,同时加入了属性
框中会在beanDefinition中加入属性。
最终生成接口实现类
扫描实现ElasticsearchCrudRepository接口类的包,最终根据接口生成实现类。实现类为ElasticsearchRepositoryFactoryBean。
当注入bean的时候,如果是FactoryBean,系统会调取它的getObject()方法注入实际对象。
实际对象通过ElasticsearchRepositoryFactoryBean的getObject()生成,最终是通过调用ElasticsearchRepositoryFactory.getRepository() 使用动态代理生成的。