栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot自定义Starter并使用配置参数

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot自定义Starter并使用配置参数

文章目录
    • 一、什么是 Spring Boot Starter ?
    • 二、Stater 的命名规范?
    • 三、自定义 Spring Boot Starter
      • 目标(需求)
      • 项目结构
      • 1、pom依赖
      • 2、功能实现代码
      • 3、自动装配配置类
      • 4、创建 spring.factories 将要加载的类配置进去
      • 打包 Starter 到 maven 仓库
    • 四、测试自定义的 Starter
      • 1、引入依赖
      • 2、配置参数
      • 3、调用 Starter 提供的功能
    • 五、使 Starter 支持配置参数默认值

一、什么是 Spring Boot Starter ?

Spring Boot 在配置上相比 Spring 要简单许多,其核心就在于 Spring Boot Starter。Spring Boot Starter 可以将模块所需的依赖根据环境自动配置。使用者只需要依赖相应功能的 Starter ,无需过多的配置和依赖,Spring Boot 就能自动扫描并加载相应的模块。

二、Stater 的命名规范?
  • Spring 官方:spring-boot-starter-{name}
  • 自行提供:{name}-spring-boot-starter
三、自定义 Spring Boot Starter 目标(需求)

实现一个短信发送的模块(本文目的为学习 Starter ,因此只是模拟实现,调用之后打印一行日志)。

项目结构

1、pom依赖


    4.0.0

    
        org.springframework.boot
        spring-boot-starter-parent
        2.6.7
    
    com.aichen.sms.springboot
    aichen-sms-spring-boot-starter
    1.0-SNAPSHOT

    
        11
        11
    

    
        
            org.springframework.boot
            spring-boot-configuration-processor
            true
        

        
            org.springframework.boot
            spring-boot-autoconfigure
        
    

2、功能实现代码
package com.aichen.sms.springboot.service;


public interface AichenSmsSend {

    
    boolean send(String phoneNum, String content);
}
package com.aichen.sms.springboot.service.impl;

import com.aichen.sms.springboot.service.AichenSmsSend;


public class AichenSmsSendImpl implements AichenSmsSend {
    @Override
    public boolean send(String phoneNum, String content) {
        System.out.println("发送成功,手机号:"+phoneNum+",内容:"+content);
        return true;
    }
}
3、自动装配配置类
package com.aichen.sms.springboot.config;

import com.aichen.sms.springboot.service.AichenSmsSend;
import com.aichen.sms.springboot.service.impl.AichenSmsSendImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
@ConditionalOnClass({AichenSmsSend.class, AichenSmsSendImpl.class})
public class SmsAutoConfigure {

    @Value("${aichen.sms.securitykey}")
    private String securitykey;

    @Bean
    @ConditionalOnMissingBean
    public AichenSmsSend aichenSmsSend(){
        if (!"123456".equals(securitykey)){
            throw new RuntimeException("爱辰短信服务注册失败,密钥不正确!");
        }
        return new AichenSmsSendImpl();
    }
}
4、创建 spring.factories 将要加载的类配置进去

此配置文件的作用类似于Bean扫描,让Spring动态加载这些类。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.aichen.sms.springboot.config.SmsAutoConfigure
打包 Starter 到 maven 仓库
mvn clean install
四、测试自定义的 Starter 1、引入依赖

    com.aichen.sms.springboot
    aichen-sms-spring-boot-starter
    1.0-SNAPSHOT

2、配置参数

application.yml

aichen:
  sms:
    securitykey: 123456
3、调用 Starter 提供的功能
package com.aichen.test.thymeleaf.controller;

import com.aichen.sms.springboot.service.AichenSmsSend;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping("/aichen/sms")
public class AichenSmsTestController {

    @Autowired
    private AichenSmsSend aichenSmsSend;

    @GetMapping("/send")
    public String send(){
        boolean send = aichenSmsSend.send("18888888888", "发财啦!");
        return send ? "发送成功" : "发送失败";
    }
}
五、使 Starter 支持配置参数默认值

以上 SmsAutoConfigure 中使用的 @Value(“${aichen.sms.securitykey}”) 引入配置的方式,不能指定默认值,依赖此 Starter 时必须在 配置文件里增加 aichen.sms.securitykey 的值,否则会报错。

换成以下方式可以给 aichen.sms.securitykey 增加默认值,当引用此 Starter 时不配置 aichen.sms.securitykey 会使用默认值。

使用实体接收配置文件的参数值:

package com.aichen.sms.springboot.config;

import org.springframework.boot.context.properties.ConfigurationProperties;


@ConfigurationProperties(prefix = "aichen.sms")
public class AichenSmsProperties {

    private String securitykey = "123456";

    public String getSecuritykey() {
        return securitykey;
    }

    public void setSecuritykey(String securitykey) {
        this.securitykey = securitykey;
    }
}

改造 SmsAutoConfigure 自动装配类:

增加 @EnableConfigurationProperties(AichenSmsProperties.class)

securitykey 的值从 实体配置 AichenSmsProperties 中获取。

package com.aichen.sms.springboot.config;

import com.aichen.sms.springboot.service.AichenSmsSend;
import com.aichen.sms.springboot.service.impl.AichenSmsSendImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
@ConditionalOnClass({AichenSmsSend.class, AichenSmsSendImpl.class})
@EnableConfigurationProperties(AichenSmsProperties.class)
public class SmsAutoConfigure {

    @Autowired
    private AichenSmsProperties aichenSmsProperties;

    @Bean
    @ConditionalOnMissingBean
    public AichenSmsSend aichenSmsSend(){
        if (!"123456".equals(aichenSmsProperties.getSecuritykey())){
            throw new RuntimeException("爱辰短信服务注册失败,密钥不正确!");
        }
        return new AichenSmsSendImpl();
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/837387.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号