一、spring boot中扫码第三方jar中的注入bean
说明:因为需要在项目中引入了的子模块,而子模块中有注入依赖,在项目中也需要用到。所以需要扫描到第三方jar中的注入bean。
IDE工具中的配置
- 关于 Spring Boot 自动注入及组件扫描 在平时使用 Spring Boot 时,常常会使用到@Configuration,@Contoller,@Service,@Component等注解,被添加这些注解的类,在 Spring Boot 启动时,会自动被 Spring 容器管理起来。
上面提到了,添加了一些注解的类会在Spring Boot 容器启动时,被加载到Spring 容器中。那么,组件扫描的作用就是:当 Spring Boot 启动时,根据定义的扫描路径,把符合扫描规则的类装配到spring容器中。
-
关于spring boot中扫描路径 springboot默认会扫描启动类所在的包及其子包;A模块的Application是在com.xxx.family包下,那么势必只能扫描到这个包下的bean。B模块的Application是在com.xxx包下,那么在A引入B以后就A就肯定扫描不到他上层包的bean了。
-
spring boot中@Component scan 通过上面的描述,我们已经知道了spring boot的扫码路径,所以如果是引入的子模块,需要扫描到的话,包的位置需要配置好,这是一个办法;但是经常没有那么刚好的设置包的位置,也挺麻烦的,所以通过添加另外注解来覆盖扫描的外部路径。
增加启动类的扫描有一下两种方式:
@ComponentScan(basePackages = { "org.test1", "org.test2" })
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
或者下面的方式,都可以扫描到外部路径
@SpringBootApplication(scanBasePackages = { "org.executor", "org.distribute" })
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
-
结果 通过上面的方式,在eclipse中已经可以实现启动模块引入jar注入bean的功能了,测试确实是可用的
spring boot打包的jar中引入第三方jar包注入的bean
- 配置好了启动类扫描的路径之后,会发现打包之后的jar包启动时,仍然会提示无法加载到引入的jar中的bean。 这是因为经过打包后,项目的目录结构变成了下面的模式
B项目本身又作为A项目BOOT-INF/lib下的jar包,A项目使用java -jar从入口启动类启动后无法扫描到B项目的注解,
且B项目中的lib也与A项目中的lib下jar包存在重复。
- 解决办法 在被引入的项目的pom.xml中增加以下配置
<configuration>
<classifier>exec</classifier>
</configuration>
完整pom.xml中的build配置如下
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
</plugins>
</build>
这样被引入的项目编译后target目录下会产生两个文件,test.jar和test-exec.jar。其中test-exec.jar与之前的结构是一样,可以被执行。
这样再对引入的项目打包后,项目BOOT-INF/lib目录下只会加入test.jar,实测启动可以正常扫描到test项目中的注解.
而如果需要执行test项目,可以执行java -jar test-exec.jar