需求描述
  当我们想要利用SpringBoot封装一套组件并发布给第三方使用时,我们就不得不考虑我们的组件能否被使用者正确引入使用,本文章讲解的是项目打包成 jar 包后 Spring 配置类未扫描、未注册Bean的解决方案。

解决方案

  此处提供三种解决方案,友好型依次提升。
① 使用者手动配置 basePackages
② 使用者通过注解方式启用配置
③ SpringBoot 主动发现
 
目前以两个项目来作为测试:
 
springboot_jar_third:它将作为第三方组件以jar包的方式注入到下面的项目中
springboot_jar_import:服务由该项目启动
 
第一种:使用者手动配置 basePackages (对组件开发者最为简单,对使用者最为繁琐)
使用此方式,对组件开发者最为简单,不需要对项目进行任何其余配置,我们只需要在测试环境使用功能后直接打包发布。但是使用者使用时需要手动配置 basePackages,假设我们的组件的包基础为:“com.example”,
这个jar包中只有一个请求地址/hello ,如果想在另一个项目中引用,可以将这个项目打成jar包(mvn clean install),加入另一个项目的pom文件中
springboot_jar_third项目:
0
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基础包,
0
配置方式: 在SpringBoot启动类或能被Spring发现的 Configuration 类上增加
@ComponentScan(basePackages={"com.example"})

 

通过此方式配置后,Spring会在启动时扫描 com.example 这个包,我们的组件自然而然也会被注册为Spring Bean
此时启动项目SpringbootJarImportApplication,输入localhost:8080/hello,便可以获取到该请求
 
 
第二种方式:通过注解方式引入(在特定的需求环境使用)
第一种方式需要使用者手动进行 basePackages 配置,当使用者忘记配置时,我们的组件则不会生效,第二种雷同,只不过配置方式有变
首先来看看我们项目(组件)的文件结构
 
0
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 上使用我们的注解,代码如下:
0
这样,当用户启动程序时,Spring就会将 ExampleConfig 注册到Bean,然后读取ExampleConfig中的 @ComponentScan 注解,就实现了我们组件全包被Spring覆盖
 
第三种:这也是本文介绍的最后一种(Spring Boot Starter),对组件开发者和使用者都比较友好,故推荐使用,如遇复杂业务,可在第二种和第三种中取舍
此方法最关键的为 resources/META-INF/spring.factories 文件,当项目启动时,Spring会扫描所有jar包下面的 spring.factories 文件,进行相应的自动配置处理,此处我们不进行深入讲解,只看看基本配置
0
其中  org.springframework.boot.autoconfigure.EnableAutoConfiguration 代表自动配置的 key,即代表需要自动配置哪些类,\ 可以理解为一个换行符,则该行下面的每行当做一个参数
# Auto Configure # 定义自动装配config类,当系统引入该jar包时, spring上下文将初始化这些config类 
org.springframework.boot.autoconfigure.EnableAutoConfiguration

 

第二行则为我们刚才看见的配置类的全路径,如果需要 Spring 自动配置多个类,我们依行写入它的全路径即可
当做完这一步,我们的组件就可以打包了,然后使用者只需要引入我们的jar包,Spring就会在启动时对我们 spring.factories 中的所有配置类进行自动配置,此时不需要进行包扫描,服务启动之后便可以将第三方组件引用过来
0
 
参考网址:
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
posted on 2021-09-15 23:24  小白coder  阅读(3813)  评论(0编辑  收藏  举报