【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.mzph.cn/news/223892.shtml

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

相关文章

Kibana搜索数据利器:KQL与Lucene

文章目录 一、搜索数据二、KQL查询1、字段搜索2、逻辑运算符3、通配符4、存在性检查5、括号 三、Lucene查询1、字段搜索2、逻辑运算符3、通配符4、范围搜索5、存在性检查6、括号 四、总结 一、搜索数据 默认情况下&#xff0c;您可以使用 Kibana 的标准查询语言&#xff0c;该…

MES安灯管理:优化生产监控的重要工具

一、MES安灯管理的概念 MES安灯管理是一种基于物理安灯和数字化管理的生产异常管理工具。它通过物理安灯和数字化系统的结合&#xff0c;实现对生产异常的实时监控和及时反馈&#xff0c;从而帮助企业快速响应和解决生产异常&#xff0c;提高生产效率和产品质量。 二、MES系统…

随机森林1(了解整体知识架构)

很多人想学习或者了解随机森林&#xff0c;查到的资料都是先讲熵&#xff0c;再讲决策树&#xff0c;然后再讲随机森林&#xff0c;前面坚持不下来或者一个地方没理解透彻&#xff0c;导致无法向下学习&#xff0c;而且公式讲解不够清晰&#xff0c;例子不够详细&#xff0c;很…

弧形导轨的安装注意事项

随着弧形导轨的应用日渐普遍&#xff0c;在日常使用中总会遇到很多各种各样的问题&#xff0c;原因很多是安装不正确或者使用不恰当。不合理的使用不但不能充分发挥其价值还会导致使用寿命大打折扣&#xff0c;使企业造成不必要的损失&#xff0c;因此大伙有必要了解一些安装的…

【Spring Boot】视图渲染技术之Freemarker

一、引言 1、什么是Freemarker FreeMarker是一款模板引擎&#xff0c;基于模板和要改变的数据&#xff0c;并用来生成输出文本&#xff08;HTML网页、电子邮件、配置文件、源代码等&#xff09;的通用工具。它不是面向最终用户的&#xff0c;而是一个Java类库&#xff0c;是一款…

SAP 特殊采购类40--库存转储

我们今天测试一下特殊采购类型40----库存转储 特殊采购类40是我们在系统中进行跨工厂需求传递与跨工厂库存转移的主要手段之一&#xff0c;其核心目的在于将某个工厂中的物料需求传递到另外一个工厂 从PP的角度在去看到话就是有个需求的专递&#xff0c;从MM角度去看这个库存转…

使用Axure RP结合内网穿透工具制作本地静态web页面并实现公网访问

作者简介&#xff1a; 懒大王敲代码&#xff0c;正在学习嵌入式方向有关课程stm32&#xff0c;网络编程&#xff0c;数据结构C/C等 今天给大家讲解使用Axure RP结合内网穿透工具制作本地静态web页面并实现公网访问&#xff0c;希望大家能觉得实用&#xff01; 欢迎大家点赞 &am…

ML流程标准规范汇总

1. 机器学习简介 机器学习是从数据中自动分析获得模型&#xff0c;并利用模型对未知数据进行预测。它是一个流程性很强的工作&#xff0c;包括数据采集、数据清洗、数据预处理、特征工程、模型调优、模型融合、模型验证、模型持久化、在线服务等模块。 而在这些基本的步…

北斗三号短报文+4G的低功耗太阳能船载报位监控方案

国内海洋船舶群体长期在海上航行&#xff0c;多数海员由于海面无信号覆盖、个人卫星通信费用昂贵、无法自由使用船载公用卫星通信设备等原因&#xff0c;无法与家人和朋友保持联系&#xff0c;甚至在遇到危险的时候也无法及时向外界发出求救信号&#xff0c;管理单位难以掌握船…

docker-harbor的私有仓库

目录 harbor的特性 harbor的组件 docker-harbor部署 Docker1 页面访问 ​编辑 上传镜像 创建项目 创建用户 给项目创建成员 上传私有仓库 docker2(远程主机上传) 如何实现仓库之间进行同步 docker3 实现远程仓库同步 仓库 保存镜像 私有&#xff0c;自定义用户…

WPF仿网易云搭建笔记(1):项目搭建

文章目录 前言项目地址动态样式组合样式批量样式覆盖Prism新建UserControler修改Material Design 笔刷收放列表可以滚动的StackPanel列表点击展开或折叠 实现效果 前言 今天接着继续细化代码&#xff0c;把整体框架写出来 项目地址 WPF仿网易云 Gitee仓库 动态样式 【WPF】C#…

企业微信模板卡片消息

投票选择型和多项选择型卡片仅企业微信3.1.12及以上版本支持 文本通知型、图文展示型和按钮交互型三种卡片仅企业微信3.1.6及以上版本支持&#xff08;但附件下载功能仍需更新至3.1.12&#xff09; 微工作台&#xff08;原企业号&#xff09;不支持展示模板卡片消息 文本通知型…

知识库SEO:提升网站内容质量与搜索引擎排名的策略

随着搜索引擎算法的不断更新和优化&#xff0c;单纯依靠关键词堆砌和外部链接的时代已经过去。现在的SEO&#xff08;搜索引擎优化&#xff09;已经转向了以提供高质量、有价值内容为核心的阶段。知识库SEO便是这个新阶段的重要策略之一。 | 一、知识库SEO的概念与意义 1.定义…

【隐私计算】tf-encrypted隐私计算框架/库基础

tf-encrypted介绍 TF Encrypted是TensorFlow中一个用于加密机器学习的框架&#xff0c;它看起来和感觉上都很像TensorFlow&#xff0c;利用了Keras API 的易用性&#xff0c;同时通过安全多方计算和同态加密实现了对加密数据的训练和预测。TF Encrypted的目标是使保护隐私的机器…

关东升老师从小白到大牛系列丛书(由清华大学出版社出版)

助力技术成长&#xff0c;成就大牛之路 在这个科技日新月异的时代&#xff0c;掌握一门编程语言或专业技能已是必备&#xff0c;不再是奢侈。清华大学出版社出版的“从小白到大牛”的系列丛书&#xff0c;涵盖Python、Java、Kotlin、Android和SQL&#xff0c;助你快速在技术之…

严世芸龟法养生经

文章目录 严世芸理念荤素搭配&#xff0c;不偏嗜动静结合心平气和 龟息法 严世芸 严世芸&#xff0c;出生于1940年&#xff0c;现任上海中医药大学的主任医师&#xff0c;教授。他父亲是近代上海有名的中医&#xff0c;他又是著名医家张伯臾的亲传弟子。 从小就在父亲诊室里长…

PO 对象被锁定

问题描述 在创建PO对象的时候&#xff0c;由于上次电脑断网导致PO连接中断&#xff0c;但服务器中登录用户还在占用PO对象&#xff0c;需要手动在POD中删除锁对象才可编辑 解决方案 登录到POD页面&#xff0c;点击右上角Administration 点击Lock Overview&#xff0c;查看…

营销投放下半场,游戏行业如何寻觅进化空间?

摘要&#xff1a;微博&#xff0c;游戏行业突围市场新利器 游戏行业&#xff0c;格局永远在变。 从2017年互联网大厂集体盯上游戏大蛋糕&#xff0c;到2021年行业收缩&#xff0c;再到今年上半年实际销售收入继去年首次出现同比下滑…几经过山车式行情的游戏行业&#xff0c;…

加密友好不意味容易!亚洲地区实施了世界上最严格的加密规定!

2023年的一大主题是亚洲作为加密货币世界中至关重要的地区的持续崛起。这在很大程度上要归功于新加坡等著名的数字资产中心&#xff0c;以及香港和日本的重新崛起。 虽然这些司法管辖区确实欢迎数字资产&#xff0c;但围绕它们的炒作可能会有些误导&#xff0c;加密友好并非意味…

【AI】如何准备mac开发vue项目的环境

为了在Mac上开发Vue项目&#xff0c;你需要准备一些工具和环境。以下是主要的步骤&#xff1a; 安装Node.js和npm&#xff1a; Vue.js是一个基于JavaScript的框架&#xff0c;因此你需要Node.js环境。访问Node.js官网下载并安装Node.js&#xff0c;这也会自动安装npm&#xff0…