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

news2024/11/15 8:29:52

一、引言

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; //null

    public SmsServiceImpl(SmsProperties smsProperties) {
        this.smsProperties = smsProperties;
    }

    @Override
    public 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里面去

    @Autowired
    private SmsProperties smsProperties;

    //@Bean 方法会在spring运行的时候自动执行,返回值会被放到spring容器中
    @Bean
    public 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: 11115
      secret: 100006
      enable: 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 {
    
        //    使用短信功能
        @Autowired
        private ISmsService iSmsService;
    
        @Test
        void 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
    @ConditionalOnMissingBean
    public 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 {
        @Autowired
        private TBookService tBookService;
    
    
        @RequestMapping("/list")
        public Object list2(PageBean pageBean) {
            List<TBook> tBooks = tBookService.selectAll(pageBean);
            return tBooks;
        }
    }
  4. 测试结果

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

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

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

相关文章

7+m6A+分型+实验,甲基化方向的生信思路,没有思路的同学可参考

今天给同学们分享一篇生信文章“Landscape analysis of m6A modification regulators related biological functions and immune characteristics in myasthenia gravis”&#xff0c;这篇文章发表在J Transl Med期刊上&#xff0c;影响因子为7.4。 结果解读&#xff1a; MG相…

Notes Domino 14.0正式版发布

大家好&#xff0c;才是真的好。 经过12个月的等待&#xff0c;经过三个Beta版本的迭代&#xff0c;昨天晚上11:00&#xff0c;Notes Domino 14.0版本正式发布&#xff01; 过去半年&#xff0c;经过我们对三个Beta版本不断的测试和介绍&#xff0c;一些新功能可能大家已经了…

基于Java的在线教育平台设计与实现论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对学生课程学习信息管理混乱&#xff0c;出错率高&#xff0c;信息安全…

人工智能如何改变未来的教育

人工智能&#xff08;AI&#xff09;正在以惊人的速度发展&#xff0c;并有可能彻底改变我们生活的方方面面&#xff0c;包括教育。AI 可以用于提高教学效率、个性化学习体验和扩大教育机会。 在教学效率方面&#xff0c;AI 可以用于自动化许多繁琐的教学任务&#xff0c;例如…

机器学习---音乐分类案例

1、傅里叶变换 时域分析&#xff1a;对一个信号来说&#xff0c;信号强度随时间的变化的规律就是时域特性&#xff0c;例如一个信号的时域波形可以表达信号随着时间的变化。 频域分析&#xff1a;对一个信号来说&#xff0c;在对其进行分析时&#xff0c;分析信号和频率有关的…

ubuntu下搜索文件的几种方法

一、whereis命令&#xff1a; whereis命令只能用于程序名的搜索&#xff0c;而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数&#xff0c;则返回所有信息。 whereis的命令格式&#xff1a; whereis [-bmsu] [BMS 目录名 -f ] 文…

C语言—每日选择题—Day47

第一题 1. 以下逗号表达式的值为&#xff08;&#xff09; (x 4 * 5, x * 5), x 25 A&#xff1a;25 B&#xff1a;20 C&#xff1a;100 D&#xff1a;45 答案及解析 D 本题考查的就是逗号表达式&#xff0c;逗号表达式是依次计算每个表达式&#xff0c;但是只输出最后一个表…

做为一个产品经理带你详细了解--动态面板的使用

&#x1f4da;&#x1f4da; &#x1f3c5;我是bing人&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Axure》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一…

vue el-cascader组件change失效以及下拉框不消失的问题

文章目录 1.前言2. 碰到的问题3. 如何解决这两个问题 1.前言 最近项目上用到el-cascader这个组件,需要可以选第一级菜单&#xff0c;也需要可以选第二级菜单&#xff0c;点击完成之后需要关闭下拉框。其实功能比较简单&#xff0c;找了很多资料&#xff0c;没有找到合适的方案…

全域营销趋势下,品牌如何让流量变留量?

2023年已开始倒计时。 回望过去三年&#xff0c;社媒直播电商经历了从“野蛮生长”到“有序生长”的快速发展时期。 罗永浩的“真还传”、新东方向东方甄选的转型、董洁直播出圈翻红&#xff0c;命运的齿轮在不断转动&#xff0c;新的故事在不断抒写着。 伴随着头部达人的快速更…

纯生信轻松拿下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…

【Sprin Aop注解式开发快速复习Aop】

Aop一般有以下常用注解: Aspect: 该注解是把此类声明为一个切面类。 Before: 该注解是声明此方法为前置通知 (目标方法执行之前就会先执行被此注解标注的方法) After: 该注解是声明此方法为后置通知 (目标方法执行完之后就会执行被此注解标注的方法) AfterReturning: 该注解…

Axure元件库的介绍以及个人简介和登录界面案例展示

目录 一. 元件介绍 二. 基本元件的使用 2.1 形状元件 2.2 图片元件 2.3 占位符 2.4 文本 2.5 线段元件 2.6 热区文件 三. 表单元件的使用 3.1 文本框 3.2 文本域 3.3 下拉列表 3.4 列表框 3.5 复选框 3.6 单选按钮 四. 菜单与表格元件的使用 4.1 树 4.2 表格…

基于单片机智能家具无线遥控控制系统设计

**单片机设计介绍&#xff0c;基于单片机智能家具无线遥控控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的智能家具无线遥控控制系统设计可以实现对家具&#xff08;如灯具、窗帘、空调等&#xff09;的…

JOSEF 组合中间继电器 RXMM1-RK214003 DC220V 不带底座

系列型号 RXMM1 RK 214 002组合中间继电器&#xff1b;RXMM1 RK 214 003组合中间继电器; RXMM1 RK 214 004组合中间继电器&#xff1b;RXMM1 RK 214 005组合中间继电器; RXMM1 RK 214 006组合中间继电器&#xff1b; 1 用途 RXMM1系列组合中间继电器用于电力系统二次回路及…

手把手教你写 Compose 动画 -- 组件大小变化 API:animateContentSize

Jetpack Compose 提供了一系列功能强大且可扩展的 API&#xff0c;可用于在应用界面中轻松实现各种动画效果。这一系列文章会逐个介绍所有的动画 API&#xff0c;通过最直观的 Demo 示例&#xff0c;手把手教你怎么写动画以及带你了解动画背后的原理。 &#x1f4d1; 手把手教你…

【Python】解读a+=b 和 a=a+b是否一样?看完恍然大悟!

文章目录 前言一、可变对象和不可变对象总结 前言 在Python中&#xff0c;对于可变和不可变对象的行为差异是一个重要概念&#xff0c;特别是在涉及到和操作时。理解这一点对于编写高效且无误的代码至关重要。 一、可变对象和不可变对象 首先&#xff0c;让我们谈谈可变和不可…

Webstorm使用方法

标题一 安装步骤 1.打开JetBrans官方网站&#xff08;https://www.jetbrains.com/webstorm&#xff09;并下载适用于您操作系统的WebStorm安装程序 2.运行下载的安装程序 3.再安装程序中选择您想要安装WebStorm的位置&#xff0c;并接收软件许可协议 4.接下来您可以选择要安…

python中else的细节

if-else 首先我们都知道else可以和if共同使用&#xff0c;如果if条件没有执行&#xff0c;就会去执行else语句 a100 if a100:print("if 语句执行了") else:print("else语句执行了") a10 if a100:print("if 语句执行了") else:print("else…

计算机组成原理---浮点数的加减运算

这是本人的做法&#xff0c;不喜勿喷&#xff01;