解决方案
此处提供三种解决方案,友好型依次提升。① 使用者手动配置 basePackages ② 使用者通过注解方式启用配置 ③ SpringBoot 主动发现目前以两个项目来作为测试:
springboot_jar_third:它将作为第三方组件以jar包的方式注入到下面的项目中 springboot_jar_import:服务由该项目启动第一种:使用者手动配置 basePackages (对组件开发者最为简单,对使用者最为繁琐) 使用此方式,对组件开发者最为简单,不需要对项目进行任何其余配置,我们只需要在测试环境使用功能后直接打包发布。但是使用者使用时需要手动配置 basePackages,假设我们的组件的包基础为:“com.example”, 这个jar包中只有一个请求地址/hello ,如果想在另一个项目中引用,可以将这个项目打成jar包(mvn clean install),加入另一个项目的pom文件中 springboot_jar_third项目:
<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基础包,
@ComponentScan(basePackages={"com.example"})
通过此方式配置后,Spring会在启动时扫描 com.example 这个包,我们的组件自然而然也会被注册为Spring Bean 此时启动项目SpringbootJarImportApplication,输入localhost:8080/hello,便可以获取到该请求 第二种方式:通过注解方式引入(在特定的需求环境使用) 第一种方式需要使用者手动进行 basePackages 配置,当使用者忘记配置时,我们的组件则不会生效,第二种雷同,只不过配置方式有变 首先来看看我们项目(组件)的文件结构
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 上使用我们的注解,代码如下:
# Auto Configure # 定义自动装配config类,当系统引入该jar包时, spring上下文将初始化这些config类 org.springframework.boot.autoconfigure.EnableAutoConfiguration
第二行则为我们刚才看见的配置类的全路径,如果需要 Spring 自动配置多个类,我们依行写入它的全路径即可 当做完这一步,我们的组件就可以打包了,然后使用者只需要引入我们的jar包,Spring就会在启动时对我们 spring.factories 中的所有配置类进行自动配置,此时不需要进行包扫描,服务启动之后便可以将第三方组件引用过来