SpringBoot Starter机制(自定义Start案例,实际开发场景中的短信模拟,AOP实现日志打印)

前言:

在我们上一篇博客中,实现Freemarke的增删改查,今天分享的是关于SpringBoot Starter机制--

1.SpringBoot Starter

1.1.什么是SpringBoot Starter

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

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

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

1.2.为什么要使用SpringBoot Starter

在我们的日常开发工作中,经常会有一些独立于业务之外的配置模块,我们经常将其放到一个特定的包下,然后如果另一个工程需要复用这块功能的时候,需要将代码硬拷贝到另一个工程,重新集成一遍,麻烦至极。如果我们将这些可独立于业务代码之外的功能配置模块封装成一个个starter,复用的时候只需要将其在pom中引用依赖即可, SpringBoot为我们完成自动装配,简直不要太爽。

1.3.应用场景

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

常见应用场景:

(1)通用模块-短信发送模块(今天案例就以模拟短信发送模块)

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

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

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

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

2.综合案例(短信发送模块

步骤1:通过注解获取到yml定义的值       

SmsProperties
package com.lya.smsspringbootstart;import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;/*** 类:名称,密钥实体* @author 程序猿-小李哥* @site www.xiaolige.com* @company 猪八戒有限集团* @create 2023-12-14-18:48*/@Data//注解==提供set,get
@Component//定义组件作用:交给spring管理
public class SmsProperties{
//应用标识@Value("${sms.key}")private String key;
//应用密钥@Value("${sms.secret}")private String secret;
}

步骤2:通过接口方式引入

ISmsService
package service;public interface ISmsService {/*** 发送短信** @param phone        要发送的手机号* @param data         要发送的内容*/void send(String phone, String data);}
SmsServiceImpl
package service;import com.lya.smsspringbootstart.SmsProperties;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);}}

SmsSpringbootStartApplicationTests
package com.lya.smsspringbootstart;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import service.SmsServiceImpl;@SpringBootTest
class SmsSpringbootStartApplicationTests {@Autowiredprivate SmsProperties smsPropre;@Testvoid contextLoads() {
//        System.out.println(smsPropre);new SmsServiceImpl(smsPropre).send("1521","好久不见,望君勿念");}}

好了,到这里效果已经实现了,但是有许多的地方也麻烦!很多的地方要自己手填。针对性做了优化!

配置注解

@ConfigurationProperties(prefix = "sms")

将写好的配置进行打包!(把application.yml中定义的sms,key,secret,enable给注掉)

2.1其他项目引入步骤:

  • 引入依赖

<!--        短信验证--><dependency><groupId>com.zking</groupId><artifactId>sms-spring-boot-start</artifactId><version>0.0.1-SNAPSHOT</version></dependency>

这里的groupId 要与启动类中的一致

  • 配置application.yml

#短信服务
sms:key: 1001secret: 2002enable: true

  • 创建Junit测试

package com.zking.spboot;import com.zking.smsspringbootstart.SmsSpringBootStartApplication;
import com.zking.smsspringbootstart.service.ISmsService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest(classes = SmsSpringBootStartApplication.class)
class SpbootApplicationTests {@Autowiredprivate ISmsService smsService;@Testpublic void send() {smsService.send("13199864","好久不见了");}}

模拟效果:

3.综合案例(基于AOP技术实现日志切面模块

3.1准备工作

        重新创建一个项目,准备步骤与上面类似

3.2 导入pom依赖

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

3.3创建切面配置类Properties

WebLogProperties.java

package com.lya.aspect.config;import org.springframework.boot.context.properties.ConfigurationProperties;/*** AOP日志配置类*/
@ConfigurationProperties(prefix ="scloud.weblog")
public class WebLogProperties {private boolean enabled;//TODO
}

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

WebLogAspect.java

package com.lya.aspect.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 {@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);}}

3.5 创建自动配置类

WebLogConfig.java

package com.lya.aspect.config;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 = "lya.weblog",value = "enabled",matchIfMissing = true)
public class WebLogConfig {@Bean@ConditionalOnMissingBeanpublic WebLogAspect webLogAspect(){return new WebLogAspect();}
}

编写spring.factories文件

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.lya.aspect.config.WebLogAspect,\com.lya.aspect.config.WebLogConfig

配置application.yml    

路径仅供参考,实际路径根据自身的项目路径为主 

案例目录:

效果:

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

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

相关文章

[elementPlus] teleported 在 ElSubMenu中的用途

如图 一个菜单对应的路由结构如上图 如果做适配窄屏幕 如果在 <ElSubMenu :index"route.path" >中不加入 teleported 就会出现问题 加上就OK了 <ElSubMenu :index"route.path" teleported>

Windows环境下QT应用程序的发布

时间记录&#xff1a;2023/12/17 1.生成版本介绍&#xff0c;debug&#xff1a;调试版本&#xff0c;携带调试信息&#xff0c;占用内存稍大一些&#xff0c;release&#xff1a;发布版本&#xff0c;一般开发完毕选择此套件进行编译生成可执行程序进行发布 2.发布步骤 &#x…

KubeSphere应用【笔记四】自定义镜像

一、概述 在KubeSphere部署Redis负载时&#xff0c;想通过应用商店部署Redis&#xff0c;通过应用商店部署redis时可以指定访问密码&#xff0c;结果应用商店部署Redis时如下图所示&#xff0c;不能进行部署&#xff0c;所以打算自己制作有默认密码的镜像&#xff0c;上传至Ha…

【MySQL】MySQL表的操作-创建查看删除和修改

文章目录 1.创建表2.查看表结构3.修改表4.删除表 1.创建表 语法&#xff1a; CREATE TABLE table_name (field1 datatype,field2 datatype,field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎;说明&#xff1a; field 表示列名datatype 表示列的类型…

WEB渗透—PHP反序列化(三)

Web渗透—PHP反序列化 课程学习分享&#xff08;课程非本人制作&#xff0c;仅提供学习分享&#xff09; 靶场下载地址&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场课程&#xff0c;基于课程制作的靶场 课程地址&#xff1a;PHP反序列化漏洞学习_哔哩…

【漏洞复现】红帆OA iorepsavexml.aspx文件上传漏洞

漏洞描述 广州红帆科技深耕医疗行业20余年,专注医院行政管控,与企业微信、阿里钉钉全方位结合,推出web移动一体化办公解决方案——iOffice20(医微云)。提供行政办公、专业科室应用、决策辅助等信息化工具,采取平台化管理模式,取代医疗机构过往多系统分散式管理,实现医…

人工智能-A*算法-最优路径搜索实验

上次学会了《A*算法-八数码问题》&#xff0c;初步了解了A*算法的原理&#xff0c;本次再用A*算法完成一个最优路径搜索实验。 一、实验内容 1. 设计自己的启发式函数。 2. 在网格地图中&#xff0c;设计部分障碍物。 3. 实现A*算法&#xff0c;搜索一条最优路径。 二、A*算法实…

QT自带打包问题:无法定位程序输入点?metaobject@qsound

文章目录 无法定位程序输入点?metaobjectqsound……检查系统环境变量的配置&#xff1a;打包无须安装qt的文件 无法定位程序输入点?metaobjectqsound…… 在执行release打包程序后&#xff0c;相应的release文件夹下的exe文件&#xff0c;无法打开 如有错误欢迎指出 检查系…

Mysql存储引擎-InnoDB

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…

ARS430毫米波雷达标定步骤

工具准备&#xff1a;CANoe&#xff0c; 标定工程文件&#xff0c;雷达标定板&#xff0c;三脚架&#xff0c;激光器&#xff0c;平口钳&#xff0c;气泡水平仪&#xff0c;小镜子&#xff0c;双面胶。 将车辆放置在车辆前方至少有20米空白视野的场地上。使用气泡水平仪大概使…

JUC并发编程 06——Synchronized与锁升级

一.Java对象内存布局和对象头 在HotSpot虚拟机里&#xff0c;对象在堆内存中的存储布局可以划分为三个部分&#xff1a;对象头(Header) 、实例数据 (Instance Data) 和 对文填充 (Padding)。 对象内部结构分为&#xff1a;对象头、实例数据、对齐填充&#xff08;保证8个字节的…

HashMap构造函数解析与应用场景

目录 1. HashMap简介 2. HashMap的构造函数 2.1 默认构造函数 2.2 指定初始容量和加载因子的构造函数 3. 构造函数参数的影响 3.1 初始容量的选择 3.2 加载因子的选择 4. 构造函数的应用场景 4.1 默认构造函数的应用场景 4.2 指定初始容量和加载因子的构造函数的应用…