需求
对于实现service注解的自动扫描然后托管,需要实现两个方面的需求:
- 托管被添加了
@Service
注解的Impl实例。 - 构建并注册
ServiceBean
,并关联Impl的引用。
Service托管
spring提供了一个@Import
注解,可以import一个ImportBeanDefinitionRegistrar
实现,在添加了@Import
的Bean构建了之后会回调ImportBeanDefinitionRegistrar#registerBeanDefinitions
方法,以用来实现自定义BeanDefinition
的注册管理。
- 通过
AutoConfigurationPackages
获取spring boot所扫描的包路径。 - 自定义一个BeanDefinitionScanner,继承
ClassPathBeanDefinitionScanner
,添加IncludeFilter,值扫描添加了@Service
注解的类。 - 调用父类的
doScan
方法,获取所有添加了@Service
注解的Impl的BeanDefinition
。 - 通过
BeanDefinitionBuilder
来构建ServiceBean
的RootBeanDefinition
并添加实现类的引用。 - 通过
@Service
实例的数据来向ServiceBean的RootBeanDefinition
中添加配置引用。 - 向registry中注册
ServiceBean
的RootBeanDefinition
以实现Service的管理。