ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SpringBoot 项目打成jar包供第三方引用自动配置(Spring发现)解决方案

2021-09-15 23:31:51  阅读:610  来源: 互联网

标签:SpringBoot Spring 配置 jar 组件 使用者 com


需求描述   当我们想要利用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

标签:SpringBoot,Spring,配置,jar,组件,使用者,com
来源: https://www.cnblogs.com/alice-cj/p/15291404.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有