SpringBoot自定义starter及自动配置

简介: SpringBoot自定义starter及自动配置

SpringBoot的核心就是自动配置,而支持自动配置的是一个个starter项目。除了官方已有的starter,用户自己也可以根据规则自定义自己的starter项目。


自定义starter条件

自动化配置需满足以下条件:


根据条件检查classpath下对应的类,也就是说需要提供对应可检查的类;

当满足条件时能够生成定义的Bean,并注册到容器中去;

能够自动配置项目所需要的配置;

自定义spring boot starter

这里通过maven项目管理工具进行starter的创建。首先我们需要创建一个简单的maven项目。这里我们以集成某短信服务为例,来创建一个项目。


创建maven项目

创建一个简单的maven项目,具体步骤省略。可通过intellj idea等IDE进行创建,也可通过maven命令进行创建。


目录结构如下:


.
├── pom.xml
├── spring-boot-starter-msg.iml
└── src
    ├── main
    └── test

在pom.xml中引入SpringBoot自动化配置依赖spring-boot-autoconfigure:


<dependency>

   <groupId>org.springframework.boot</groupId>

   <artifactId>spring-boot-autoconfigure</artifactId>

   <version>2.1.5.RELEASE</version>

</dependency>


定义Service服务类

定义Service服务类,有两个作用,一个为引入的项目本省的功能性服务,另外一个用来springboot自动配置时的判断依据。


这里定义一个MsgService的类。


package com.secbro2.msg;
import com.secbro2.utils.HttpClientUtils;
public class MsgService {
  /**
   * 访问发送短信的url地址
   */
  private String url;
  /**
   * 短信服务商提供的请求keyId
   */
  private String accessKeyId;
  /**
   * 短信服务商提供的KeySecret
   */
  private String accessKeySecret;
  public MsgService(String url, String accessKeyId, String accessKeySecret) {
    this.url = url;
    this.accessKeyId = accessKeyId;
    this.accessKeySecret = accessKeySecret;
  }
  public int sendMsg(String msg) {
    // 调用http服务并发送消息,返回结果
    return HttpClientUtils.sendMsg(url, accessKeyId, accessKeySecret, msg);
  }
  // 省略getter/setter方法
}

其中MsgService用到了一个工具类HttpClientUtils。在HttpClientUtils中只简单打印了请求的参数信息。

package com.secbro2.utils;
public class HttpClientUtils {
  public static int sendMsg(String url, String accessKeyId, String accessKeySecret, String msg) {
    //TODO 调用指定url进行请求的业务逻辑
    System.out.println("Http请求,url="   url   ";accessKeyId="   accessKeyId   ";accessKeySecret="   accessKeySecret   ";msg="   msg);
    return 0;
  }
}

定义配置类

定义MsgProperties配置类,用于封装application.properties或application.yml中的基础配置。这里关于短信发送的配置前缀统一采用msg。

@ConfigurationProperties(prefix = "msg")
public class MsgProperties {
  /**
   * 访问发送短信的url地址
   */
  private String url;
  /**
   * 短信服务商提供的请求keyId
   */
  private String accessKeyId;
  /**
   * 短信服务商提供的KeySecret
   */
  private String accessKeySecret;
  // 其他参数定义
  // 省略getter/setter方法
}

通过@ConfigurationProperties注解来进行对应的属性的装配。

创建自动化配置类

自动配置类就是一个普通的java类,通过不同的注解来对其赋予不同的功能。其中最核心的当然是@Configuration注解。

@Configuration
@ConditionalOnClass(MsgService.class)
@EnableConfigurationProperties(MsgProperties.class)
public class MsgAutoConfiguration {
  /**
   * 注入属性配置类
   */
  @Resource
  private MsgProperties msgProperties;
  @Bean
  @ConditionalOnMissingBean(MsgService.class)
  @ConditionalOnProperty(prefix = "msg", value = "enabled", havingValue = "true")
  public MsgService msgService() {
    MsgService msgService = new MsgService(msgProperties.getUrl(), msgProperties.getAccessKeyId(),
        msgProperties.getAccessKeySecret());
    // 如果提供了其他set方法,在此也可以调用对应方法对其进行相应的设置或初始化。
    return msgService;
  }
}

MsgAutoConfiguration类上的注解,@Configuration用来声明该类为一个配置类;@ConditionalOnClass注解说明只有当MsgService类存在于classpath中时才会进行相应的实例化;@EnableConfigurationProperties将application.properties中对应的属性配置设置于MsgProperties对象中;


msgService方法上的注解,@Bean表明该方法实例化的对象会被加载到容器当中;@ConditionalOnMissingBean指明当容器中不存在MsgService的对象时再进行实例化;@ConditionalOnProperty指定了配置文件中msg.enabled=true时才进行相应的实例化。


添加spring.factories

当所有的基础代码和自动配置类都准备完成,就需要对其进行注册。也就是我们熟悉的META-INF/spring.factories配置文件了。当然,这个需要在自己的项目中进行创建。


org.springframework.boot.autoconfigure.EnableAutoConfiguration=\

com.secbro2.msg.MsgAutoConfiguration

1

2

在spring.factories配置文件中注册MsgAutoConfiguration类。如果有多个自动配置类,用逗号分隔换行即可。


至此,一个基于Spring Boot的自动配置starter便完成了。使用“maven:install”将其打包到本地maven仓库或上传至私服。其他项目便可以通过maven依赖使用。


starter项目使用

在其他项目中,通过以下依赖引入该依赖。


<dependency>
    <groupId>com.secbro2</groupId>
    <artifactId>spring-boot-starter-msg</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

然后在当前项目的application.properties中配置对应的参数:

msg.enabled=true
msg.url=127.0.0.1
msg.accessKeyId=10001
msg.accessKeySecret=afelwjfwfwef

比如其他项目同样是Spring Boot项目,则可定义一个简单的Controller来进行测试。

@RestController
public class HelloWorldController {
  @Resource
  private MsgService msgService;
  @RequestMapping("/sendMsg")
  public String sendMsg(){
    msgService.sendMsg("测试消息");
    return "";
  }
}

当通过浏览器访问:http://localhost:8080/sendMsg时,便会打印出如下日志:


Http请求,url=127.0.0.1;accessKeyId=10001;accessKeySecret=afelwjfwfwef;msg=测试消息

1

说明MsgService对象被自动配置,并且测试通过。


而针对短信发送这样的starter,可以进行进一步拓展,实现短信发送的各种基础功能,而当其他项目需要时只用引入对应的依赖,并配置具体的参数即可马上使用,是不是非常方便?


总结下Starter的工作流程:


Spring Boot在启动时扫描项目所依赖的JAR包,寻找包含spring.factories文件的JAR包;

根据spring.factories配置加载AutoConfiguration类;

根据@Conditional注解的条件,进行自动配置并将Bean注入Spring容器。



目录
相关文章
|
3月前
|
Java Spring
Spring Boot配置的优先级?
在Spring Boot项目中,配置可通过配置文件和外部配置实现。支持的配置文件包括application.properties、application.yml和application.yaml,优先级依次降低。外部配置常用方式有Java系统属性(如-Dserver.port=9001)和命令行参数(如--server.port=10010),其中命令行参数优先级高于系统属性。整体优先级顺序为:命令行参数 &gt; Java系统属性 &gt; application.properties &gt; application.yml &gt; application.yaml。
606 0
|
21天前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
223 4
|
28天前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
探索Spring Boot的@Conditional注解的上下文配置
|
2月前
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
724 10
|
7月前
|
缓存 Java API
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
本文介绍了在Spring Boot中配置Swagger2的方法。通过创建一个配置类,添加`@Configuration`和`@EnableSwagger2`注解,使用Docket对象定义API文档的详细信息,包括标题、描述、版本和包路径等。配置完成后,访问`localhost:8080/swagger-ui.html`即可查看接口文档。文中还提示了可能因浏览器缓存导致的问题及解决方法。
755 0
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
|
7月前
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
951 0
|
3月前
|
人工智能 安全 Java
Spring Boot yml 配置敏感信息加密
本文介绍了如何在 Spring Boot 项目中使用 Jasypt 实现配置文件加密,包含添加依赖、配置密钥、生成加密值、在配置中使用加密值及验证步骤,并提供了注意事项,确保敏感信息的安全管理。
816 1
|
7月前
|
Java 数据库连接 数据库
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——MyBatis 介绍和配置
本文介绍了Spring Boot集成MyBatis的方法,重点讲解基于注解的方式。首先简述MyBatis作为持久层框架的特点,接着说明集成时的依赖导入,包括`mybatis-spring-boot-starter`和MySQL连接器。随后详细展示了`properties.yml`配置文件的内容,涵盖数据库连接、驼峰命名规范及Mapper文件路径等关键设置,帮助开发者快速上手Spring Boot与MyBatis的整合开发。
893 0
|
7月前
|
缓存 Java 应用服务中间件
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——依赖导入和Thymeleaf相关配置
在Spring Boot中使用Thymeleaf模板,需引入依赖`spring-boot-starter-thymeleaf`,并在HTML页面标签中声明`xmlns:th=&quot;http://www.thymeleaf.org&quot;`。此外,Thymeleaf默认开启页面缓存,开发时建议关闭缓存以实时查看更新效果,配置方式为`spring.thymeleaf.cache: false`。这可避免因缓存导致页面未及时刷新的问题。
290 0
|
7月前
|
Java 数据库 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——指定项目配置文件
在实际项目中,开发环境和生产环境的配置往往不同。为简化配置切换,可通过创建 `application-dev.yml` 和 `application-pro.yml` 分别管理开发与生产环境配置,如设置不同端口(8001/8002)。在 `application.yml` 中使用 `spring.profiles.active` 指定加载的配置文件,实现环境快速切换。本节还介绍了通过配置类读取参数的方法,适用于微服务场景,提升代码可维护性。课程源码可从 [Gitee](https://gitee.com/eson15/springboot_study) 下载。
249 0