前因:在研究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的依赖关系,点击图标即可跳转到供方或者需方,这个功能在分析源码时还是很实用的
题外话:ConfigServerMvcConfiguration配置类中有EnvironmentController类型的bean方法,ConfigServerAutoConfiguration配置类通过@import方法引入ConfigServerMvcConfiguration,config-server包的spring.factories文件中记录ConfigServerAutoConfiguration的全限定名,通过spring的自动化配置完成EnvironmentController的装载