一、需求
一个系统分模块开发,并且通过Main模块引入其他模块来整合功能,如何在Main模块中加载其他模块所定义的Bean。
二、解决方案
有两种解决方案,一种是通过扫描的方式引入其他依赖中的Bean,另外一种是通过SpringBoot提供的SPI扩展来引入其他依赖中的Bean。
1. 通过扫描的方式引入其他依赖中的Bean
如果其他模块中的类所在的包路径是Main模块的包或者子包,则可以直接引入。因为Spring的扫描的路径为classpath*:<包路径转换后的目录>/**/*.class,其中classpath*表明Spring不仅会扫描Main模块的类路径,还会扫描依赖的jar包的类路径。
如果其他模块中的类所在的包路径不是Main模块的包或者子包,可以通过设置ComponentScan注解中的value属性为所要引入的包即可。
2. 通过SpringBoot提供的SPI扩展的方式引入其他依赖中的Bean
SpringBoot提供了SPI扩展的方式引入其他依赖中的Bean,即自动装配,SpringBoot2.7以前可以通过配置META-INF/spring.factories文件,
SpringBoot2.7以后可以通过配置/META/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,不过SpringBoot2.7以后为了兼容以前的版本习惯,依然可以配置META-INF/spring.factories。