前因:在研究springcloud config组件时,我发现config-server包下的EnvironmentController不在扫描的包路径下却可以响应客户端的请求,这吸引了我的注意,我的问题是:EnvironmentController是怎么被添加进bean工厂的。本章就是分享我在查找bean依赖关系中收获的一点小技巧
通常来讲,让bean加入spring的管理有3种方法
第一种是使用扫描组件@ComponentScan和@Component注解,也是开发中最常见的做法。springboot应用启动时会扫描@ComponentScan的basePackages属性指定的包路径下的类文件,将路径下用组件注解(@Component,@Controller,@Service)修饰的类加入spring容器
第二种是基于springboot自动配置原理在resources/META-INF目录下添加spring.factories,在文件中写入被@Configuration修饰的配置类的全限定名,配置类内被@Bean修饰的方法返回的bean对象将交由spring托管
第三种是使用@Import注解导入,类似于import写入导入类的全限定名即可,在开发中使用较少
回到正题,IDEA可以通过注解旁的绿色小图标查看bean的供应关系,点击图标即可跳转到供方或者需方,这个功能在分析源码时还是很实用的
选中文件右键,然后选择Diagrams -> Show Diagram -> Spring Beans Dependencies 可以显示bean之间的关系图
题外话:ConfigServerMvcConfiguration配置类中有EnvironmentController类型的bean方法,ConfigServerAutoConfiguration配置类通过@import方法引入ConfigServerMvcConfiguration,config-server包的spring.factories文件中记录ConfigServerAutoConfiguration的全限定名,通过spring的自动化配置完成EnvironmentController的装载