1.在我们做项目的时候,经常会需要引入我们的一些公共依赖,诸如filter,或者是一些用来进行接口访问日志记录的切面,如我们当前写的项目叫做A项目,公共依赖叫做common,我们希望在A项目启动的时候,将common项目只中的一些类也生成bean归A项目的spring容器管理,使之生效。下面归纳两种做法。 做法一: 在我们A项目的启动类上修改 @ComponentScan("com.myself.kxc.proj") 增加common项目我们需要的bean所在的类包如:
这样我们就能使用B项目中的一些Bean,以及B项目中的一些切面,filter也可以生效了。 如现在我们在A项目中需要使用B项目中的TestIoc这个bean
我们在A项目中使用属性注入,代码如下
启动时会报找不到对应的bean,报错信息如下
当我们将启动类上的@ComponentScan修改后,可以正常启动,一些注解也生效了。
我们的日志切面也生效了:
做法二:
做法一可以解决问题,但是需要修改我们的业务项目的启动类,说明我们的common项目设计的不是那么合理,侵入性比较强,我们可以利用@SpringBootApplication包含的@EnableAutoConfiguration注解的原理来解决此事,他会去我们的资源文件夹下找META-INF/spring.factories文件,去看我们的第三方jar包中有哪些类需要注入。好多的spring-boot-xxxx-starter都是这么实现的,如:
对于我们的项目我们也可以参照这种做法,在我们的common项目下的resource文件夹下新建META-INF/spring.factories,文件内容如下:
然后我们将common项目重新打包部署,A项目,maven依赖重新导入,启动项目,可以发现项目正常启动,切面等生效
附录:在我们没有私服的时候,如何将common项目deploy到我们的本地仓库 需要在pom文件中添加打包插件,和部署私服指定,如下:
<build>
<pluginManagement>
<plugins>
<plugin>
<!-- Build an executable JAR -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.5.4</version>
</plugin>
</plugins>
</pluginManagement>
</build>
<distributionManagement>
<repository>
<id>mylocal</id>
<url>file:/Users/mazejiang/Downloads/mavenrepository</url>
</repository>
<!-- <snapshotRepository>-->
<!-- <id>sna</id>-->
<!-- <url></url>-->
<!-- </snapshotRepository>-->
</distributionManagement>