【Spring Boot】Starter机制的使用及案例

一、引言

1、什么是SpringBoot Starter

        SpringBoot中的starter是一种非常重要的机制(自动化配置),能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置。starter让我们摆脱了各种依赖库的处理,需要配置各种信息的困扰。

        SpringBoot会自动通过classpath路径下的类发现需要的Bean,并注册进IOC容器。SpringBoot提供了针对日常企业应用研发各种场景的spring-boot-starter依赖模块。

所有这些依赖模块都遵循着约定成俗的默认配置,并允许我们调整这些配置,即遵循“约定大于配置”的理念。

2、为什么要使用SpringBoot Starter

  1. 简化配置:通过使用Starter,开发者可以减少手动添加和配置依赖的工作量。Starter通常包含了许多相关的依赖项,以及一些配置模板和自动配置功能,使用者可以非常方便地将其引入到应用程序中,并快速地获得相关的功能。
  2. 统一管理:Starter能够将相关依赖和配置统一集成进一个模块,这使得项目的依赖管理更加清晰和有序。
  3. 自动配置:SpringBoot的Starter机制能够自动扫描并加载相应的模块信息,从而减少了开发者手动配置的工作量,提高了开发效率。
  4. 方便团队协作:由于Starter的使用,开发者无需关心复杂的依赖关系和配置,只需关注业务逻辑的开发,这有助于提高团队协作的效率。

3、应用场景

        我们的日常开发工作中,可能会需要开发一个通用模块,以供其它工程复用。SpringBoot就为我们提供这样的功能机制,我们可以把我们的通用模块封装成一个个starter,这样其它工程复用的时候只需要在pom中引用依赖即可,由SpringBoot为我们完成自动装配

常见应用场景:

  1. 通用模块-短信发送模块
  2. 基于AOP技术实现日志切面
  3. 分布式雪花ID,Long转String,解决精度问题
  4. 微服务项目的数据库连接池配置
  5. 微服务项目的每个模块都要访问redis数据库,每个模块都要配置redisTemplate

4、自动加载核心注解说明

SpringBoot的自动加载核心注解是@SpringBootApplication。这个注解是Spring Boot最核心的注解,用于标识这是一个Spring Boot应用,并开启Spring Boot的各项能力。

实际上,@SpringBootApplication注解主要组合了以下几个核心注解:

  1. @Configuration:表示这是一个配置类,Spring Boot会为这个类生成一个默认的bean定义。
  2. @EnableAutoConfiguration:这是Spring Boot自动配置的核心注解,它会根据项目的依赖情况自动进行bean的定义和属性的配置。
  3. @ComponentScan:这个注解用于扫描当前类所在的包及其子包,找到标注了@Component, @Service, @Repository等注解的类,并将其定义成bean。

5、命名规范

starter项目和SpringBoot工程结构没有什么区别。必须引入的依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>
</dependency>

spring-boot-configuration-processor 是一个注解处理器,用于处理 Spring Boot 配置类的注解,并生成配置属性的元数据。它在开发过程中起到以下几个重要的作用:

  1. 生成配置属性的元数据: 当你使用 @ConfigurationProperties 注解来声明配置类时,spring-boot-configuration-processor 会解析该注解,并生成与配置属性相关的元数据。这些元数据包括属性的名称、类型、描述、默认值等信息。这些信息可以帮助 IDE 在开发过程中提供代码提示、自动补全和验证功能。

  2. 提供配置属性的编译时验证: 使用 @ConfigurationProperties 注解时,你可以使用其他注解(如 @Value@Valid 等)来描述配置属性的约束条件。spring-boot-configuration-processor 可以处理这些注解,并在编译时进行验证。这样,你可以在开发阶段及早发现配置属性的错误或不一致,而不是在运行时才遇到问题。

  3. 简化配置类的编写: 通过使用 spring-boot-configuration-processor,你可以更轻松地编写配置类。它会自动处理 @ConfigurationProperties 注解及其相关注解,生成属性的 getter、setter 方法,并提供默认的配置文件映射规则。这样,你可以专注于定义配置属性的结构和业务逻辑,而不需要手动编写重复的代码。

  4. 提升开发体验: spring-boot-configuration-processor 增强了开发工具的功能,例如在 IDE 中提供配置属性的智能提示、文档、类型检查等功能。这可以减少开发过程中的错误,并提高代码的可读性和可维护性。

spring-boot-configuration-processor 可以简化 Spring Boot 配置类的开发,提供编译时验证和开发工具的支持,从而改善开发体验并减少潜在的配置错误。它是 Spring Boot 框架中重要的辅助工具,帮助开发者更高效地处理配置属性。

  • SpringBoot官方命名方式:

spring-boot-starter-{模块名}

例如:spring-boot-starter-web

二、综合案例

1、模拟短信发送

①创建配置类Properties

提供accessKeyId和accessKeySecret属性的getter、setter方法。

package com.zl.smsspringbootstart;import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;@Data
//@Component
//@ConfigurationProperties 会自动去yml文件中找到需要的配置将它放到对应的属性中
@ConfigurationProperties(prefix = "sms")
public class SmsProperties {/*** 应用标识*/
//    @Value("${sms.key}")private String key;/*** 应用密钥*/
//    @Value("${sms.secret}")private String secret;/*** 关闭*/private String enable;}

②编写短信业务功能

service

package com.zl.smsspringbootstart.service;public interface ISmsService {/*** 发送短信** @param phone        要发送的手机号* @param data         要发送的内容*/void send(String phone, String data);}

接口实现impl

package com.zl.smsspringbootstart.service.impl;import com.zl.smsspringbootstart.SmsProperties;
import com.zl.smsspringbootstart.service.ISmsService;public class SmsServiceImpl implements ISmsService {private SmsProperties smsProperties; //nullpublic SmsServiceImpl(SmsProperties smsProperties) {this.smsProperties = smsProperties;}@Overridepublic void send(String phone, String data) {String key = smsProperties.getKey();String secret = smsProperties.getSecret();System.out.println("接入短信系统,Key=" + key + ",Secret=" + secret);System.out.println("短信发送,phone=" + phone + ",data=" + data);}}

③创建自动配置类

@EnableConfigurationProperties注解的作用是@ConfigurationProperties注解生效。

如果只配置@ConfigurationProperties注解,在IOC容器中是获取不到properties配置文件转化的bean的。

package com.zl.smsspringbootstart;import com.zl.smsspringbootstart.service.ISmsService;
import com.zl.smsspringbootstart.service.impl.SmsServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
//开启配置加载
@EnableConfigurationProperties({SmsProperties.class})
//添加一个条件 sms.enable
@ConditionalOnProperty(prefix = "sms", name = "enable", havingValue = "true")
public class SmsConfig {//控制当前的service是否加载到spring里面去@Autowiredprivate SmsProperties smsProperties;//@Bean 方法会在spring运行的时候自动执行,返回值会被放到spring容器中@Beanpublic ISmsService smsService() {return new SmsServiceImpl(smsProperties);}}

④编写spring.factories文件加载自动配置类

resources下新建META-INF文件夹,然后创建spring.factories文件。在该文件中加入如下配置,该配置指定上步骤中定义的配置类为自动装配的配置:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.zl.smsspringbootstart.SmsConfig

其中AutoConfig是starter配置文件的类限定名,多个之间逗号分割,还可以\进行转义即相当于去掉后面换行和空格符号。

⑤打包

⑥其他项目引用

  1. 引入依赖
            <dependency><groupId>com.zl</groupId><artifactId>sms-spring-boot-start</artifactId><version>0.0.1-SNAPSHOT</version></dependency>

  2. 配置application.yml文件
    enable如果为false则不使用

    # 配置
    sms:key: 11115secret: 100006enable: true
  3. 创建Junit测试
     

    package com.example.springboot01;import com.zl.smsspringbootstart.service.ISmsService;
    import com.zl.weblog.WebLogProperties;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
    class Springboot01ApplicationTests {//    使用短信功能@Autowiredprivate ISmsService iSmsService;@Testvoid contextLoads() {iSmsService.send("137", "123456");}}
    

  4. 测试结果

2、基于AOP技术实现日志切面

①创建配置类Properties

enabled属性用于控制是否开关日志,请提供enabled属性的getter、setter方法。

package com.zl.weblog;import org.springframework.boot.context.properties.ConfigurationProperties;// 添加@ConfigurationProperties注解,将配置文件中的属性映射到WebLogProperties类中
@ConfigurationProperties(prefix = "spcloud.weblog")
public class WebLogProperties {// 定义一个boolean类型的变量private boolean enabled;// 构造函数public WebLogProperties() {}// 获取enabled属性public boolean isEnabled() {return enabled;}// 设置enabled属性public void setEnabled(boolean enabled) {this.enabled = enabled;}
}

②实现基于AOP技术的日志切面功能

package com.zl.weblog;import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;@Aspect
@Component
@Slf4j
public class WebLogAspect {//@Pointcut("execution(public * com.zl..controller.*.*(..))")// 定义一个切入点,拦截com.zl..controller.*.*(..)方法@Pointcut("execution(* *..*Controller.*(..))")public void webLog() {}@Before("webLog()")// 在执行方法之前执行public void doBefore(JoinPoint joinPoint) throws Throwable {// 接收到请求,记录请求内容ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();// 记录下请求内容log.info("开始服务:{}", request.getRequestURL().toString());log.info("客户端IP :{}", request.getRemoteAddr());log.info("参数值 :{}", Arrays.toString(joinPoint.getArgs()));}@AfterReturning(returning = "ret", pointcut = "webLog()")// 在执行方法之后执行public void doAfterReturning(Object ret) throws Throwable {// 处理完请求,返回内容log.info("返回值 : {}", ret);}
}

③创建自动配置类

package com.zl.weblog;//import com.zl.spcloudspringbootstarter.properties.WebLogProperties;import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @ConditionalOnProperty 配置属性a:* 1:不配置a        matchifmissing=false 不满足      matchifmissing=true 满足* 2:配置a=false    matchifmissing=false 不满足      matchifmissing=true 不满足* 3:配置a=true     matchifmissing=false 满足        matchifmissing=true 满足*/
@Configuration
@EnableConfigurationProperties({WebLogProperties.class})
@ConditionalOnProperty(prefix = "spcloud.weblog",value="enabled",matchIfMissing = true)
public class WebLogConfig {@Bean@ConditionalOnMissingBeanpublic WebLogAspect webLogAspect() {return new WebLogAspect();}
}

④编写spring.factories文件加载自动配置类

resources下新建META-INF文件夹,然后创建spring.factories文件。在该文件中加入如下配置,该配置指定上步骤中定义的配置类为自动装配的配置:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.zl.weblog.WebLogConfig

其中AutoConfig是starter配置文件的类限定名,多个之间逗号分割,还可以\进行转义即相当于去掉后面换行和空格符号。

⑤打包

⑥其他项目引用

  1. 引入依赖
    <!--        切面--><dependency><groupId>com.zl</groupId><artifactId>WebLog</artifactId><version>0.0.1-SNAPSHOT</version></dependency>

  2. 配置application.yml文件
    enable如果为false则不使用

    # 配置
    spcloud:weblog:enabled: true
  3. 创建Controller层测试
    在这里可以使用自己的Controller层测试

    package com.example.springboot01.controller;import com.example.springboot01.entity.TBook;
    import com.example.springboot01.page.PageBean;
    import com.example.springboot01.service.TBookService;
    import com.github.pagehelper.PageHelper;
    import org.aspectj.lang.annotation.Aspect;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
    @RequestMapping("/book")
    public class TBookController {@Autowiredprivate TBookService tBookService;@RequestMapping("/list")public Object list2(PageBean pageBean) {List<TBook> tBooks = tBookService.selectAll(pageBean);return tBooks;}
    }
  4. 测试结果

分享就到这里!欢迎搭建在评论区进行讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/277050.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为了告诉老板BI真的有用,我出杀手锏了

起初&#xff0c;我只是想提高报表开发效率和质量&#xff0c;减少开发工作量&#xff0c;但没想到&#xff0c;我无意中找到了升级信息化的一大利器——BI大数据分析工具。 事情的起因是我在论坛看到有人说他用BI大数据分析解决了公司信息化问题&#xff0c;成功把自己从“数…

车载测试包括哪些测试

车载测试包括CW测试和现网测试。以下是相关介绍&#xff1a; CW测试&#xff1a; 即在典型区域架设发射天线&#xff0c;发射单载被信号&#xff0c;然后在预先设定的路线上进行车载测试&#xff0c;使用车载接收机接收并记录各处的信号场强。CW测试频率和环境选择方便&#…

2023年国赛高教杯数学建模A题定日镜场的优化设计解题全过程文档及程序

2023年国赛高教杯数学建模 A题 定日镜场的优化设计 原题再现 构建以新能源为主体的新型电力系统&#xff0c;是我国实现“碳达峰”“碳中和”目标的一项重要措施。塔式太阳能光热发电是一种低碳环保的新型清洁能源技术[1]。   定日镜是塔式太阳能光热发电站&#xff08;以下…

纯生信轻松拿下5+分文。铜死亡+免疫浸润+预后模型,快学起来吧

今天给同学们分享一篇生信文章“A novel defined risk signature of cuproptosis-related long non-coding RNA for predicting prognosis, immune infiltration, and immunotherapy response in lung adenocarcinoma”&#xff0c;这篇文章发表在Front Pharmacol期刊上&#x…

Linux查询指定时间点段日志Linux查询指定文件

Linux服务器高效查询日志查询文件 Ⅰ、常用几种日志查询语法Ⅱ、常用几种查询语法 Ⅰ、常用几种日志查询语法 #查询某日志前xx行日志 head -n 行数 日志文件名 #查询某日志后xx行日志 tail -n 行数 日志文件名 #查询固定时间点日志&#xff08;前提是这个时间点确实有日志输出…

音乐制作软件Ableton Live 11 mac功能特点

Ableton Live 11 mac是一款数字音频工作站软件&#xff0c;用于音乐制作、录音、混音和现场演出是一款流行的音乐制作软件。 Ableton Live 11 mac特点和功能 Comping功能&#xff1a;Live 11增加了Comping功能&#xff0c;允许用户在不同的录音轨道上进行多次录音&#xff0c;…

在Google play上架马甲包需要注意什么?

上架马甲包是开发者们推广主应用&#xff0c;获得更多曝光、下载量、占据市场份额的有效方法。然而&#xff0c;在Google paly上发布应用&#xff0c;要遵守谷歌相关规定&#xff0c;谷歌不允许马甲包应用的上架。 因此&#xff0c;开发者们需要通过一些技术手段和多种方式对马…

案例066:基于微信小程序的家政预约设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

生物分子相互作用的奥秘与挑战:探索未来药物设计的新方向

在生命科学领域&#xff0c;生物分子相互作用的研究日益受到关注。这种相互作用涉及蛋白质、核酸、脂质和糖类等生物分子之间的相互识别、结合和调控。理解这些相互作用对于揭示生命现象、疾病机制和治疗策略具有重要意义。 然而&#xff0c;生物分子相互作用的奥秘也带来了诸…

产学合作谱新篇,深职大-卓翼氢能无人机控制技术研发中心落成!

近日&#xff0c;北京卓翼智能科技有限公司&#xff08;以下简称“卓翼智能”&#xff09;与深圳职业技术大学&#xff08;以下简称“深职大”&#xff09;氢能无人机控制技术研发中心揭牌仪式暨产教融合校企合作座谈会圆满举行。 澳大利亚阿德莱德大学&#xff0c;欧洲科学院院…

周周清(2)----踩坑日记

周一&#xff1a; 1.之前换了一个jdk&#xff0c;然后又改了很多东西&#xff0c;很乱&#xff0c;以至于很多项目都不能直接运行了&#xff0c;所以今天就将ideal删除并且更新版本到2022.3.3&#xff0c;并且重新将ideal里面的配置环境变量&#xff0c;以及jdk下载安装配置&a…

操作系统中的作业管理

从用户的角度看&#xff0c;作业是系统为完成一个用户的计算任务&#xff08;或一次事务处理&#xff09;所做的工作总和。例如&#xff0c;对于用户编制的源程序&#xff0c;需经过对源程序的编译、连接编辑或连接装入及运行产生计算结果。这其中的每一个步骤&#xff0c;常称…