SpringBoot Starter机制 ——自动化配置

news2024/12/30 4:11:25

目录

一、Starter机制

1.1 什么是 SpringBoot Starter

1.2 SpringBoot Starter 的作用

1.3 Starter的应用场景

二、案例

2.1 模拟短信发送模版

2.2 AOP实现日志切面模版


一、Starter机制

1.1 什么是 SpringBoot Starter

        Spring Boot Starter是Spring Boot框架提供的一种便利机制,用于简化项目的依赖管理和配置。它是一组预定义的依赖项和配置的集合,可以通过添加相应的Starter来快速引入和配置特定的功能或技术栈。

Spring Boot Starter的命名通常遵循一种约定,即以spring-boot-starter-为前缀,后跟具体的功能或技术名称。例如:

  • spring-boot-starter-web: 用于构建Web应用程序的Starter。
  • spring-boot-starter-data-jpa: 集成Spring Data JPA,简化对数据库的访问。
  • spring-boot-starter-security: 集成Spring Security,提供安全认证和授权功能。
  • spring-boot-starter-test: 用于编写测试的Starter。

1.2 SpringBoot Starter 的作用

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

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

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

1.3 Starter的应用场景

1)通用模块-短信发送模块

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

3)分布式雪花ID,Long转String,解决精度问题

4)微服务项目的数据库连接池配置

5)微服务项目的每个模块都要访问redis数据库,每个模块都要配置redisTemplate

1、spring-boot-starter-web:

  • 应用场景: 用于构建Web应用程序,包括RESTful API的开发。
  • 依赖: 包括Spring MVC、嵌入式Servlet容器(如Tomcat)、JSON处理器等。

2、spring-boot-starter-data-jpa:

  • 应用场景: 用于使用Spring Data JPA进行持久化操作,简化数据库访问。
  • 依赖: 包括Hibernate、Spring Data JPA、数据源等。

3、spring-boot-starter-security:

  • 应用场景: 提供身份验证和授权功能,用于保护应用程序的安全性。
  • 依赖: 包括Spring Security、密码加密工具、身份验证和授权相关的依赖项。

4、spring-boot-starter-thymeleaf:

  • 应用场景: 用于构建使用Thymeleaf模板引擎的Web应用程序。
  • 依赖: 包括Thymeleaf、Spring Web等。

5、spring-boot-starter-data-rest:

  • 应用场景: 用于构建RESTful API,自动将JPA实体暴露为REST资源。
  • 依赖: 包括Spring Data REST、Spring MVC等。

6、spring-boot-starter-test:

  • 应用场景: 用于编写单元测试和集成测试。
  • 依赖: 包括JUnit、Spring Test等。

7、spring-boot-starter-amqp:

  • 应用场景: 用于与消息队列(如RabbitMQ)进行集成。
  • 依赖: 包括Spring AMQP、RabbitMQ客户端等。

8、spring-boot-starter-batch:

  • 应用场景: 用于构建批处理作业。
  • 依赖: 包括Spring Batch、数据库驱动等。

9、spring-boot-starter-data-redis:

  • 应用场景: 用于与Redis进行集成。
  • 依赖: 包括Spring Data Redis、Jedis等。

10、spring-boot-starter-log4j2:

  • 应用场景: 使用Log4j2进行日志记录。
  • 依赖: 包括Log4j2、Logback等。

二、案例

2.1 模拟短信发送模版

1、引入pom依赖

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

2、创建配置类Properties

package com.ycxw.smsspringbootstart;

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

/**
 * 短信服务配置类
 *
 * @author 云村小威
 * @create 2023-12-14 19:09
 */
@Data
@ConfigurationProperties(prefix = "sms")
public class SmsProperties {
    private String accessKeyId;//访问ID、即帐号
    private String accessKeySecret;//访问凭证,即密码
    private String enable; //启动开关
}

@ConfigurationProperties 注解是Spring Boot中用于绑定配置属性的注解。它的主要作用是将配置文件中的属性值绑定到Java对象的属性上,使得可以通过这些Java对象方便地访问配置属性。

在上述示例中,SmsProperties 类使用了 @ConfigurationProperties 注解,并指定了 prefix 属性为 "sms"。这意味着配置文件中以 sms 为前缀的属性值会被绑定到 SmsProperties 类的对应属性上。例如,如果配置文件中有 sms.accessKeyId=My Applicationsms.accessKeySecret=123,那么这两个值就会被绑定到 accessKeyIdaccessKeySecret 属性上。 

.yml:

3、编写短信业务功能 

ISmsService:

package com.ycxw.smsspringbootstart.service;

public interface ISmsService {

    /**
     * 发送短信
     * @param phone 要发送的手机号
     * @param data  要发送的内容
     */
    void send(String phone, String data);

}

SmsServiceImpl:

package com.ycxw.smsspringbootstart.service;


import com.ycxw.smsspringbootstart.SmsProperties;

public class SmsServiceImpl implements ISmsService {

    private SmsProperties smsProperties;

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

    @Override
    public void send(String phone, String data) {
        String key = smsProperties.getAccessKeyId();
        String secret = smsProperties.getAccessKeySecret();
        System.out.println("接入短信系统,Key=" + key + ",Secret=" + secret);
        System.out.println("短信发送,phone=" + phone + "data=" + data);
    }

}

这里不用@Service注解交给spring管理的原因是我们需要自定义(如:smss.enable)动态调用该类。

4、创建自动配置类

package com.ycxw.smsspringbootstart;

import com.ycxw.smsspringbootstart.service.ISmsService;
import com.ycxw.smsspringbootstart.service.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;

/**
 * @author 云村小威
 * @create 2023-12-14 19:21
 */
@Configuration
//开启配置加载
@EnableConfigurationProperties({SmsProperties.class})
//添加一个条件 sms.enable
@ConditionalOnProperty(prefix = "sms",name = "enable",havingValue = "true")
public class SmsConfig {
    //控制当前的service是否加载到spring里面去
    @Autowired
    private SmsProperties smsProperties;

    @Bean
    public ISmsService smsService(){
        return new SmsServiceImpl(smsProperties);
    }
}

        这是一个 Spring Boot 的配置类,它负责配置与短信服务相关的 bean,并且通过条件判断 (@ConditionalOnProperty) 控制是否加载这些配置。

解析:

  1. @Configuration: 这个注解表示这是一个配置类,用于定义和配置 Spring Bean。

  2. @EnableConfigurationProperties({SmsProperties.class}): 这个注解用于开启对 SmsProperties 类的配置属性的支持。SmsProperties 类是一个用于封装短信服务的配置属性的类,通过这个注解,Spring Boot 会自动注入这些属性。

    1. @ConditionalOnProperty: 这个注解用于在满足指定条件的情况下才加载这个配置类。在这里,它的条件是 sms.enable 属性的值必须为 "true",即只有当配置文件中的 sms.enable=true 时,这个配置类才会生效。

  3. @Autowired 注解:表示要自动注入 SmsProperties 类型的 bean。这个 bean 是通过 @EnableConfigurationProperties 开启的配置属性注入。

  4. @Bean public ISmsService smsService() {...}: 这个方法定义了一个名为 smsService 的 Bean,并且返回了一个 ISmsService 的实例,通常是 SmsServiceImpl。这个方法使用了 @Bean 注解,表示这是一个 Spring Bean 的定义。

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

在resources下新建META-INF文件夹,然后创建spring.factories文件;

在该文件中加入如下配置,该配置指定上步骤中定义的配置类为自动装配的配置:

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

6、打包安装

打开Maven插件执行 install 命令;

可在配置的maven仓库中查看该项目同包名的目录下找到该依赖

7、在其它项目引用并测试

一、引入依赖

        <!--模拟短信验证启动器-->
        <dependency>
            <!--属下包名-->
            <groupId>com.ycxw</groupId>
            <!--项目名-->
            <artifactId>smsspringbootstart</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

该属性值参考编写的机制模块pom:

二、配置application.yml

 

enable: true 表示请用该模块,false则不启:

三、测试类测试

package com.ycxw.boot;

import com.ycxw.smsspringbootstart.service.ISmsService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class BootApplicationTests {
    @Autowired
    private ISmsService smsService;

    @Test
    void contextLoads() {
        smsService.send("17883838312","hello");
    }

}

 运行结果:

2.2 AOP实现日志切面模版

1、编写日志启动类

package com.ycxw.smsspringbootstart.properties;


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

/**
 * 日志启动配置类
 *
 * @author 云村小威
 * @create 2023-12-14 19:09
 */
@Data
@ConfigurationProperties(prefix = "weblog")
public class WebLogProperties {
    private boolean enabled;

    public WebLogProperties() {
    }
}

 2、编写日志切面

package com.ycxw.smsspringbootstart.config;

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 {
    //定义切入点匹配所有以 "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);
    }
}
  1. @Aspect该注解表明这是一个切面类,用于定义横切关注点(cross-cutting concerns),即在应用程序中横跨多个模块的共享行为。

  2. @Component将这个切面类标记为Spring的组件,以便Spring容器能够自动扫描并注册它。

  3. @Slf4jLombok 提供的注解,用于自动生成日志变量 log

  4. @Pointcut("execution(* *..*Controller.*(..))")定义切入点,匹配所有以 "Controller" 结尾的类中的所有方法。这个切入点用于捕获Web层的所有请求。

  5. @Before("webLog()")在切入点之前执行的通知(Advice)。在方法执行前,记录请求相关的信息。

  6. @AfterReturning(returning = "ret", pointcut = "webLog()")在切入点返回结果后执行的通知。记录返回值。

  7. ServletRequestAttributesSpring提供的用于封装HTTP请求的对象,可以通过它获取请求相关的信息。

  8. RequestContextHolder.getRequestAttributes()获取当前线程的RequestAttributes,这里是获取 ServletRequestAttributes

  9. HttpServletRequest request = attributes.getRequest()获取当前请求的 HttpServletRequest 对象。

  10. log.info("开始服务:{}", request.getRequestURL().toString())记录请求的URL。

  11. log.info("客户端IP :{}", request.getRemoteAddr())记录客户端的IP地址。

  12. log.info("参数值 :{}", Arrays.toString(joinPoint.getArgs()))记录请求的方法参数值。

  13. log.info("返回值 : {}", ret)记录请求处理完后的返回值。

        这个切面类主要用于记录Web请求的一些关键信息,包括请求的URL、客户端IP、请求参数以及方法的返回值。这对于在开发和调试阶段更好地了解系统运行状态是很有帮助的。

3、创建自动配置类

package com.ycxw.smsspringbootstart.config;

import com.ycxw.smsspringbootstart.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;

@Configuration
@EnableConfigurationProperties({WebLogProperties.class})
@ConditionalOnProperty(prefix = "weblog", value = "enabled")
public class WebLogConfig {

    @Bean
    @ConditionalOnMissingBean
    public WebLogAspect webLogAspect() {
        return new WebLogAspect();
    }
}
  1. @ConditionalOnMissingBean

            该注解表示只有在容器中不存在名为 webLogAspect 的Bean时,才会创建这个Bean。这样,如果用户已经定义了自己的 WebLogAspect Bean,这个自定义的 Bean 将不会被替换。
  2. public WebLogAspect webLogAspect() {...}

            这个方法返回一个 WebLogAspect 的实例,作为一个Bean注册到Spring容器中。如果满足了 @ConditionalOnProperty@ConditionalOnMissingBean 的条件,这个Bean将被创建。

        这个配置类的作用是在特定的配置条件下,创建一个 WebLogAspect 的Bean,并将其纳入Spring容器的管理。通过条件注解,可以在特定的配置条件下控制Bean的创建和生效。

4、添加spring.factories文件加载自动配置类

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.ycxw.smsspringbootstart.SmsConfig,\com.ycxw.smsspringbootstart.config.WebLogConfig

5、在其他项目中导入该模块依赖

方法同上案例👆

6、编写 .yml 启动配置

 

7、运行项目调用Controller层方法接口测试 

将weblog配置下的enabled属性设为 false 则不在记录请求日志信息

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

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

相关文章

[Linux] LVS负载均衡群集+NAT部署

一、LVS负载均衡群集知识 1.1 群集的的定义及意义 Cluster&#xff0c;集群&#xff08;也称群集&#xff09;由多台主机构成&#xff0c;但对外只表现为一一个整体&#xff0c;只提供一-个访问入口(域名或IP地址)&#xff0c; 相当于一台大型计算机。 群集的作用&#xff1…

upload-labs笔记

简介 upload-labs是一个使用php语言编写的&#xff0c;专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共21关&#xff0c;每一关都包含着不同上传方式。 文件上传漏洞是指&#xff1a; Web 服务器允许用户将文件上传至其…

使用blip2进行图片输入文本输出

多模态的重要模型blip2,官方提供模型可以直接用来图片生成文本 github地址&#xff1a;https://github.com/salesforce/LAVIS/tree/main/projects/blip2 个人相当于跑了一下blip2的demo&#xff0c;记录下过程&#xff0c;供今后需要参考&#xff1a; 1、首先是环境安装&#…

Spring上下文之注解模块ConfigurationMethod

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

如何实现免费的文档翻译

文中有彩蛋&#xff0c;请一定要看完。 目录 文中有彩蛋&#xff0c;请一定要看完。 一、问题的提出 二、文档翻译现状 三、如何免费海量文档翻译 1. 采用CAT工具机器翻译API法 2. 采用小牛文档翻译 四、学后反思 一、问题的提出 随着互联网和人工智能技术的飞速发展&…

【力扣】19. 删除链表的倒数第 N 个结点

19. 删除链表的倒数第 N 个结点 相比于昨天&#xff0c;感觉刷题越来越轻松了~ 我进步了&#xff01; 以后刷题力度要加快了&#xff0c;因为我报了蓝桥杯&#xff01;加油~ 法一&#xff1a;计算链表长度 思路&#xff1a; 首先用个函数来计算出该链表的长度&#xff0c;然…

接口返回HTML页面详解

import requests from bs4 import BeautifulSoup import re import jsonurl https://listado.mercadolibre.com.mx/hogar-muebles-jardin/cocina/almacenamiento-organizacion/organizadores-cocina/_CustId_570995983_PrCategId_AD# 添加 headers 和 cookies headers {User-…

批量解压imagenet1k数据集中的zip文件

导言&#xff1a; 最近在处理imagenet1k数据集时&#xff0c;面对大量的zip包&#xff0c;手动一个一个解压显然不是明智的选择。作为程序员&#xff0c;我们可以采用批量解压的方法来提高效率&#xff0c;下面就是解决这一问题的方法和原因分析。 问题背景&#xff1a; image…

拆解大语言模型 RLHF 中的PPO算法

为什么大多数介绍大语言模型 RLHF 的文章&#xff0c;一讲到 PPO 算法的细节就戛然而止了呢&#xff1f;要么直接略过&#xff0c;要么就只扔出一个 PPO 的链接。然而 LLM x PPO 跟传统的 PPO 还是有些不同的呀。 其实在 ChatGPT 推出后的相当一段时间内&#xff0c;我一直在等…

11月,1Panel开源面板项目收到了这些评论

2023年11月24日&#xff0c;1Panel开源面板项目&#xff08;https://github.com/1Panel-dev&#xff09;发布了题为《10月&#xff0c;1Panel开源面板收到了这些评论》的社区评论合集。在该文章的评论区&#xff0c;很多社区用户跟帖发表了自己对1Panel开源项目的使用感受和意见…

【思考】只有实对称矩阵才能正交对角化吗?【矩阵的合同】

1&#xff1a;命题改写&#xff08;A可以正交对角化&#xff09; 2&#xff1a;左乘Q右乘Q逆&#xff08;Q转置&#xff09; 3&#xff1a;取转置 4&#xff1a;得证 总结 可以看到&#xff0c;矩阵如果可以正交对角化&#xff0c;那么一定是实对称矩阵。 另外&#xff0c;这…

stm32项目(12)——基于stm32f407zgt6的频率计设计

1.项目功能 配置stm32自带的定时器&#xff0c;以一定的周期产生中断&#xff0c;在中断服务函数里面&#xff0c;对某个IO口进行取反&#xff0c;这样就在该管脚上产生了一定频率的方波&#xff08;频率可以用按键调节&#xff09;。然后再使用stm32的捕获功能&#xff0c;对产…

Python语言学习笔记之十一(DotEnv)

本课程对于有其它语言基础的开发人员可以参考和学习&#xff0c;同时也是记录下来&#xff0c;为个人学习使用&#xff0c;文档中有此不当之处&#xff0c;请谅解。 1、认识Python DotEnv dotenv是Python中的一个工具包&#xff0c;它主要用于谈取项目中的.env文件&#xff0…

科研论文中PPT图片格式选择与转换:EPS、SVG 和 PDF 的比较

当涉及论文中的图片格式时&#xff0c;导师可能要求使用 EPS 格式的图片。EPS&#xff08;Encapsulated PostScript&#xff09;是一种矢量图格式&#xff0c;它以 PostScript 语言描述图像&#xff0c;能够无损地缩放并保持图像清晰度。与像素图像格式&#xff08;如 PNG 和 J…

VR智慧眼:为各行业打造3D数字化业务协同平台

自改革开放以来&#xff0c;城镇化建设一直在不断推进实施&#xff0c;如今各城市化速度虽然在不断加快&#xff0c;但随之而来的部分城市开始出现资源短缺、环境污染、交通拥堵、安全隐患等问题&#xff0c;因此为了满足智慧城市大型区域场景数字化升级需求&#xff0c;助力区…

SQL Server数据库使用T-SQL语句简单填充

文章目录 操作步骤&#xff1a;1.新建数据库起名RGB2.新建表起名rgb3.添加三个列名4.点击新建查询5.填入以下T-SQL语句&#xff0c;点击执行&#xff08;F5&#xff09;6.刷新之后&#xff0c;查看数据 操作环境&#xff1a; win10 Microsoft SQL Server Management Studio 20…

【项目管理】CMMI对项目管理有哪些个人启发和思考

导读&#xff1a;本人作为项目经理参与公司CMMI5级评审相关材料准备工作&#xff0c;现梳理CMMI有关知识点&#xff0c;并结合项目给出部分示例参考&#xff0c;以及本人对于在整理材料过程中一些启发和体验思考。 目录 1、CMMI定义 2、CMMI-5级 3、CMMI文档清单 4、示例-度…

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

一、引言 1、什么是SpringBoot Starter SpringBoot中的starter是一种非常重要的机制(自动化配置)&#xff0c;能够抛弃以前繁杂的配置&#xff0c;将其统一集成进starter&#xff0c;应用者只需要在maven中引入starter依赖&#xff0c;SpringBoot就能自动扫描到要加载的信息并启…

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;一些新功能可能大家已经了…