如何在我们的SpringBoot项目中导入jar包依赖的时候,将依赖中的某些bean注入到当前容器

467 阅读2分钟

1.在我们做项目的时候,经常会需要引入我们的一些公共依赖,诸如filter,或者是一些用来进行接口访问日志记录的切面,如我们当前写的项目叫做A项目,公共依赖叫做common,我们希望在A项目启动的时候,将common项目只中的一些类也生成bean归A项目的spring容器管理,使之生效。下面归纳两种做法。 做法一: 在我们A项目的启动类上修改 @ComponentScan("com.myself.kxc.proj") 增加common项目我们需要的bean所在的类包如:

image.png

这样我们就能使用B项目中的一些Bean,以及B项目中的一些切面,filter也可以生效了。 如现在我们在A项目中需要使用B项目中的TestIoc这个bean

截屏2023-03-22 16.29.10.png 我们在A项目中使用属性注入,代码如下

截屏2023-03-22 16.32.27.png 启动时会报找不到对应的bean,报错信息如下

image.png 当我们将启动类上的@ComponentScan修改后,可以正常启动,一些注解也生效了。

image.png

image.png 我们的日志切面也生效了:

image.png 做法二: 做法一可以解决问题,但是需要修改我们的业务项目的启动类,说明我们的common项目设计的不是那么合理,侵入性比较强,我们可以利用@SpringBootApplication包含的@EnableAutoConfiguration注解的原理来解决此事,他会去我们的资源文件夹下找META-INF/spring.factories文件,去看我们的第三方jar包中有哪些类需要注入。好多的spring-boot-xxxx-starter都是这么实现的,如:

image.png 对于我们的项目我们也可以参照这种做法,在我们的common项目下的resource文件夹下新建META-INF/spring.factories,文件内容如下:

image.png 然后我们将common项目重新打包部署,A项目,maven依赖重新导入,启动项目,可以发现项目正常启动,切面等生效

image.png

image.png

附录:在我们没有私服的时候,如何将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>