解决方案
此处提供三种解决方案,友好型依次提升。① 使用者手动配置 basePackages ② 使用者通过注解方式启用配置 ③ SpringBoot 主动发现目前以两个项目来作为测试:
springboot_jar_third:它将作为第三方组件以jar包的方式注入到下面的项目中 springboot_jar_import:服务由该项目启动第一种:使用者手动配置 basePackages (对组件开发者最为简单,对使用者最为繁琐) 使用此方式,对组件开发者最为简单,不需要对项目进行任何其余配置,我们只需要在测试环境使用功能后直接打包发布。但是使用者使用时需要手动配置 basePackages,假设我们的组件的包基础为:“com.example”, 这个jar包中只有一个请求地址/hello ,如果想在另一个项目中引用,可以将这个项目打成jar包(mvn clean install),加入另一个项目的pom文件中 springboot_jar_third项目: springboot_jar_import项目中添加springboot_jar_third jar包:
<dependency> <groupId>com.example</groupId> <artifactId>springboot_jar_third</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
如果想要springboot_jar_import项目启动时使用springboot_jar_third jar中的hello请求方法,则需要扫描springboot_jar_third中的com.example基础包, 配置方式: 在SpringBoot启动类或能被Spring发现的 Configuration 类上增加
@ComponentScan(basePackages={"com.example"})
通过此方式配置后,Spring会在启动时扫描 com.example 这个包,我们的组件自然而然也会被注册为Spring Bean 此时启动项目SpringbootJarImportApplication,输入localhost:8080/hello,便可以获取到该请求 第二种方式:通过注解方式引入(在特定的需求环境使用) 第一种方式需要使用者手动进行 basePackages 配置,当使用者忘记配置时,我们的组件则不会生效,第二种雷同,只不过配置方式有变 首先来看看我们项目(组件)的文件结构 ExampleConfig则为我们主要配置类,相当于我们组件的入口,代码如下
package com.example.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan("com.example") public class ExampleConfig { }
其中,第一行是声明为一个配置类 第二行为设置自动扫描包,让Spring能够发现我们封装的组件的其他 Spring Bean 到这儿还远远没完,因为我们的目的是使用者通过注解才能发现该配置类,所以我们还需要建立一个注解类,此处取名为 EnableExampleConfig,我们来看看EnableExampleConfig中的代码:
package com.example.config; import org.springframework.context.annotation.Import; import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) @Documented @Import({ExampleConfig.class}) public @interface EnableExampleConfig { }
关键代码为第 4 行,此行是代码导入EnableExampleConfig 类,也就是我们前面的配置类。 自此,我们的任务就完成了,剩下的步骤就交于使用者了。 当使用者使用我们组件,需要在能被Spring发现到的 Configuration 上使用我们的注解,代码如下: 这样,当用户启动程序时,Spring就会将 ExampleConfig 注册到Bean,然后读取ExampleConfig中的 @ComponentScan 注解,就实现了我们组件全包被Spring覆盖 第三种:这也是本文介绍的最后一种(Spring Boot Starter),对组件开发者和使用者都比较友好,故推荐使用,如遇复杂业务,可在第二种和第三种中取舍 此方法最关键的为 resources/META-INF/spring.factories 文件,当项目启动时,Spring会扫描所有jar包下面的 spring.factories 文件,进行相应的自动配置处理,此处我们不进行深入讲解,只看看基本配置 其中 org.springframework.boot.autoconfigure.EnableAutoConfiguration 代表自动配置的 key,即代表需要自动配置哪些类,\ 可以理解为一个换行符,则该行下面的每行当做一个参数
# Auto Configure # 定义自动装配config类,当系统引入该jar包时, spring上下文将初始化这些config类 org.springframework.boot.autoconfigure.EnableAutoConfiguration
第二行则为我们刚才看见的配置类的全路径,如果需要 Spring 自动配置多个类,我们依行写入它的全路径即可 当做完这一步,我们的组件就可以打包了,然后使用者只需要引入我们的jar包,Spring就会在启动时对我们 spring.factories 中的所有配置类进行自动配置,此时不需要进行包扫描,服务启动之后便可以将第三方组件引用过来 参考网址: https://www.cnblogs.com/adversary/p/10346278.html https://www.lmlphp.com/user/16538/article/item/477335/ https://blog.csdn.net/reggergdsg/article/details/110479353