Spring Boot 手写starter!!!

原因:为什么要手写starter???

        原因:简化功能。

实例:以分页为例:写一个starter。

1.首先定义一个PageX注解。

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PageX {
}

2.对这个注解进行增强,PageXAop。

/** Copyright (c) 2020, 2024,  All rights reserved.**/
package cn.scl.pagex.aop;import cn.hutool.core.util.ObjectUtil;
import com.github.pagehelper.PageHelper;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;/*** <p>Project: pages - PageXAOP</p>* <p>Powered by scl On 2024-02-18 16:32:09</p>* <p>描述:<p>** @author 孙臣龙 [1846080280@qq.com]* @version 1.0* @since 17*/
@Component
@Aspect
public class PageXAOP {@Pointcut("@annotation(cn.scl.core.annotations.PageX)")public void pointcut(){}@Around("pointcut()")public Object around(ProceedingJoinPoint pjp) throws Throwable {System.out.println("目标方法执行之前");//获取请求RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();//获取参数String pageNum = request.getParameter("pageNum");String pageSize = request.getParameter("pageSize");if(ObjectUtil.isNotEmpty(pageNum) && ObjectUtil.isNotEmpty(pageSize) ){PageHelper.startPage(Integer.parseInt(pageNum),Integer.parseInt(pageSize));}Object result = pjp.proceed();//执行目标方法System.out.println("目标方法执行之后");return result;}
}

3、定义统一返回格式,ResponseDTO。

/** Copyright (c) 2020, 2024,  All rights reserved.**/
package cn.scl.model.dto;import lombok.Data;/*** <p>Project: pages - ResponseDTO</p>* <p>Powered by scl On 2024-02-18 16:26:38</p>* <p>描述:<p>** @author 孙臣龙 [1846080280@qq.com]* @version 1.0* @since 17*/
@Data
public class ResponseDTO {private int code ; //0为请求成功,非0为请求失败private String message; //返回的信息private Object data; //返回的数据//请求成功调用方法public static ResponseDTO success(Object data){ResponseDTO responseDTO = new ResponseDTO();responseDTO.setCode(0);responseDTO.setData(data);return responseDTO;}//请求失败调用方法public static ResponseDTO error(int code,String message){ResponseDTO responseDTO = new ResponseDTO();responseDTO.setCode(code);responseDTO.setMessage(message);return responseDTO;}
}

4、统一对controller进行处理,MyResponseAdvice。

/** Copyright (c) 2020, 2024,  All rights reserved.**/
package cn.scl.pagex.advice;import cn.hutool.json.JSONUtil;
import cn.scl.core.exception.BizException;
import cn.scl.model.dto.ResponseDTO;
import com.github.pagehelper.Page;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;import java.util.HashMap;
import java.util.Map;/*** <p>Project: pages - MyResponseAdvice</p>* <p>Powered by scl On 2024-02-18 16:48:23</p>* <p>描述:<p>** @author 孙臣龙 [1846080280@qq.com]* @version 1.0* @since 17*/
@RestControllerAdvice
public class MyResponseAdvice implements ResponseBodyAdvice<Object> {@Overridepublic boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {return true;}@Overridepublic Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {if (body instanceof ResponseDTO){return body;}if (aClass == StringHttpMessageConverter.class){return JSONUtil.toJsonStr(body);}ResponseDTO dto = ResponseDTO.success(body);if (body instanceof Page) {Page page = (Page) body;long total = page.getTotal();Map<String, Object> m = new HashMap<>();m.put("total", total);m.put("item", body);dto = ResponseDTO.success(m);}return dto;}
}

5、定义一个属性类,用来是否开启注解,PageXProperties。

/** Copyright (c) 2020, 2024,  All rights reserved.**/
package cn.scl.pagex.properties;import lombok.Data;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.context.properties.ConfigurationProperties;/*** <p>Project: scl-root - PageXProperties</p>* <p>Powered by scl On 2024-02-19 16:59:30</p>* <p>描述:<p>** @author 孙臣龙 [1846080280@qq.com]* @version 1.0* @since 17*/
@Data
@ConfigurationProperties(prefix = "cn.scl.pagex")
@EnableAutoConfiguration
public class PageXProperties {private boolean enable=true;
}

6、将需要装配配的类集中起来,自动装配时只需扫描这一个类即可,PageXAutoConfiguration。

@Configuration
@Import({MyResponseAdvice.class, PageXAOP.class})
@ConditionalOnProperty(prefix = "cn.scl.pagex" ,value = "enable" ,havingValue = "true",matchIfMissing = true)
public class PageXAutoConfiguration { //领头羊
}

7、开启自动装配,在resource目录下新建,META-INF/spring.factories文件。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\cn.scl.pagex.autoconfiguration.PageXAutoConfiguration

8.如何打包发布??

目的:可以把我们书写的jar包发布到maven私有仓库,简称私仓

1. 打开云效

2.点击 非生产库-snapshot

mave release仓库与snapshot仓库区别?

在软件开发中,"Maven release 仓库"和"Maven snapshot 仓库"是两种不同的仓库类型,用于存储Maven构建的软件包。

Maven Release 仓库:

Maven Release 仓库用于存储稳定版本的软件包,这些版本经过测试并且在生产环境中使用。当项目开发到一个稳定的版本时,开发人员可以创建一个发布版本并将其上传到 Maven Release 仓库。这些版本具有固定的版本号,并且不会被覆盖或修改。开发人员和其他用户可以通过指定这些稳定的版本号来下载和使用软件包,以确保他们获取的是稳定且经过验证的代码。

Maven Snapshot 仓库:

Maven Snapshot 仓库用于存储开发中的版本或快照版本的软件包。这些版本在开发过程中可能经常变化,并且不稳定。开发人员可以将项目的最新代码以快照版本的形式部署到 Maven Snapshot 仓库中。快照版本具有动态的版本号,通常带有时间戳或其他唯一标识符,以区别于稳定版本。快照版本可以方便地进行测试和共享,但不适合在生产环境中使用,因为它们可能包含未解决的问题或经过充分验证的代码。

这两种仓库的区别在于稳定版本和开发版本之间的区别,以及用途和用例。 Maven Release 仓库用于存储稳定版本,而 Maven Snapshot 仓库则用于存储开发中的快照版本。

3.根据如下步骤,下载setting.xml文件

4.将下载文件放置到 C:\Users\你的用户名\.m2 如下位置,如果你之前有settings.xml文件,请先提前备份.

5. 双击 deploy 就可以发布到私仓,

在私仓就可以看到了对应的jar包,别人就可以直接使用了。

6.如果要想把源码也打包进去,需要maven-source-plugin插件

 <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId><executions><execution><id>attach-sources</id><phase>package</phase><goals><goal>jar</goal></goals></execution></executions>
</plugin>

XML

再次打包,你会看到私仓多出-source.jar , 别人在使用的时候,可以下载源码查看

目录结构:

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

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

相关文章

【计算机毕业设计】541鲜花商城系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

pikachu靶场-RCE

介绍&#xff1a; RCE(remote command/code execute)概述 RCE漏洞&#xff0c;可以让攻击者直接向后台服务器远程注入操作系统命令或者代码&#xff0c;从而控制后台系统。 远程系统命令执行 一般出现这种漏洞&#xff0c;是因为应用系统从设计上需要给用户提供指定的远程命…

Pytorch 自用 Scheduler 分享

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

TreeData 数据查找

TreeData 数据查找 最近做需求的时候遇到了这样的一个需求&#xff0c;Tree组件数据支持查找&#xff0c;而且TreeData的数据层级是无限级的 开始想的事借助UI组件库&#xff08;Ant-design-vue&#xff09;中的Tree组件的相关方法直接实现,看了下api 发现没法实现&#xff0c;…

【前端素材】推荐优质后台管理系统PORTAL平台模板(附源码)

一、需求分析 后台管理系统是一种具有多层次结构的软件系统&#xff0c;用于管理网站、应用程序或系统的后台操作和管理。下面是对后台管理系统的分层次、详细分析&#xff1a; 第一层&#xff1a;用户界面层 登录界面&#xff1a;提供用户登录验证&#xff0c;确保只有经过授…

Puppeteer 使用实战:如何将自己的 CSDN 专栏文章导出并用于 Hexo 博客(三)

文章目录 往期效果将文章信息导出适配 hexo 的文章模板导出的文章路径问题终端控制执行脚本代码整理结尾 往期 Puppeteer 使用实战&#xff1a;如何将自己的 CSDN 专栏文章导出并用于 Hexo 博客&#xff08;二&#xff09; 效果 写了一个 node 脚本用来批量处理 md 文件 本期…

代码随想录算法训练营第50天|123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

文章目录 123.买卖股票的最佳时机III思路代码 188.买卖股票的最佳时机IV思路代码 123.买卖股票的最佳时机III 题目链接&#xff1a;123.买卖股票的最佳时机III 文章讲解&#xff1a;代码随想录|123.买卖股票的最佳时机III 视频讲解&#xff1a;123.买卖股票的最佳时机III 思路 …

第九届大数据与计算国际会议 (ICBDC 2024) 即将召开!

2024年第九届大数据与计算国际会议&#xff08;ICBDC 2024&#xff09;将于2024年5月24至26日在泰国曼谷举行。本次会议由朱拉隆功大学工程学院工业工程系主办。ICBDC 2024的宗旨是展示大数据和计算主题相关科学家的最新研究和成果&#xff0c;为来自不同地区的专家代表们提供一…

【多线程】synchronized 关键字 - 监视器锁 monitor lock

synchronized 1 synchronized 的特性1) 互斥2) 可重入 2 synchronized 使用示例1) 修饰代码块: 明确指定锁哪个对象.2) 直接修饰普通方法: 锁的 SynchronizedDemo 对象3) 修饰静态方法: 锁的 SynchronizedDemo 类的对象 3 Java 标准库中的线程安全类 1 synchronized 的特性 1)…

操作系统-复试笔记

http://t.csdnimg.cn/PJLWh 操作系统基础 什么是操作系统&#xff1f; 操作系统&#xff08;Operating System&#xff0c;简称 OS&#xff09;是管理计算机硬件与软件资源的程序&#xff0c;是计算机的基石。操作系统本质上是一个运行在计算机上的软件程序 &#xff0c;用于…

智能风控体系之个人客户画像建设

客户画像最早在互联网电商中应用&#xff0c;在刻画目标群体时&#xff0c;数据分析师会将用户数据进行分析并形成合适的客户画像标签&#xff0c;涉及常见字段包括有姓名&#xff0c;性别&#xff0c;年龄&#xff0c;收货地址&#xff0c;手机号&#xff0c;银行卡&#xff0…

【Java程序设计】【C00294】基于Springboot的车辆充电桩管理系统(有论文)

基于Springboot的车辆充电桩管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的车辆充电桩管理系统 本系统前台功能模块分为&#xff1a;首页功能和用户后台管理 后台功能模块分为&#xff1a;管理员功能和…

抖音小店是什么?怎么玩?今天一文详解!

大家好&#xff0c;我是电商小布。 在电商这个行业快速发展的情况下&#xff0c;抖音短视频平台也想利用到自己平台的优势&#xff0c;加入其中。 抖音小店项目就是抖音与电商的结合。 简单来说&#xff0c;就是在抖音平台上开网店&#xff0c;进行产品的交易。 不同于以前…

袁庭新ES系列11节 | Elasticsearch基本查询

前言 查询操作是Elasticsearch最核心的模块之一。Elasticsearch能够达到数据的实时搜索&#xff0c;而且性能非常稳定&#xff0c;能很方便地用于对大量数据进行搜索和分析。这些都体现了Elasticsearch强大的搜索能力&#xff0c;因此关于Elasticsearch的查询知识的相关学习就…

秒懂百科,C++如此简单丨专栏导读及学习方法

目录 写在前面 专栏独有亮点 专栏目录总览 口头禅 订阅方式 保证 写在结尾 写在前面 本专栏为C的入门课程&#xff0c;包括了C的基础知识和算法入门。 如果你真心想学C&#xff0c;那么你一定要订阅此专栏&#xff0c;里面的21节课能够让新手快速入门。 &#x1f3c5;跟…

新能源汽车PACK电池包的气密性测试需要用到哪些快速密封连接器

PACK电池包是新能源汽车的重要部件之一&#xff0c;在全部组装完成后需要对其壳体进行气密性测试&#xff0c;以确保壳体的密封性能&#xff0c;避免有雨水、灰尘等外界侵扰拒之门外&#xff0c;从而保证电池的使用寿命不受损害。 新能源汽车PACK电池包 在做气密性测试时需要用…

[rospack] Error: package ‘moveit_setup_assistant‘ not found解决方法

执行&#xff1a;rosrun moveit_setup_assistant moveit_setup_assistant 显示报错&#xff1a;[rospack] Error: package ‘moveit_setup_assistant’ not found 这是由于没有安装moveit的包&#xff0c;所以找不到。 解决方法就是安装moveit包&#xff1a; sudo apt-get in…

备战蓝桥杯————双指针技巧巧解数组1

利用双指针技巧来解决七道与数组相关的题目。 两数之和 II - 输入有序数组&#xff1a; 给定一个按升序排列的数组&#xff0c;找到两个数使它们的和等于目标值。可以使用双指针技巧&#xff0c;在数组两端设置左右指针&#xff0c;根据两数之和与目标值的大小关系移动指针。 …

展锐S8000安卓核心板参数_紫光展锐5G核心板模块定制方案

展锐S8000核心板模块是基于八核S8000平台开发设计的&#xff0c;采用了先进的6nm EUV制程技术。搭载了全新的智能Android 13操作系统&#xff0c;展现出超强的画面解析能力和高性能双通道MIPI&#xff0c;拥有120Hz高刷新率&#xff0c;独立NPU和3.2TOPS Al算力&#xff0c;同时…

K8S-001-Virtual box - Network Config

A. 配置两个IP&#xff0c; 一个连接内网&#xff0c;一个链接外网: 1. 内网配置(Host only&#xff0c; 不同的 virutal box 的版本可以不一样&#xff0c;这些窗口可能在不同的地方&#xff0c;但是配置的内容是一样的): 静态IP 动态IP 2. 外网&#xff08;创建一个 Networ…