手写启动类(start)

为什么要手写一个start?

简化代码,仅使用一个注解就可以实现分页功能(以下以分页为例)。

1.定义一个pageX注解


@Documented
@Retention(RetentionPolicy.RUNTIME)//运行时可以通过反射API获取到注解信息
@Target({ElementType.METHOD, ElementType.TYPE})//该注解作用的范围,接口、类、方法
public @interface PageX {
}

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

@Component
@Aspect
public class PageXAOP {
    //定义切点
    @Pointcut("@annotation(com.by.core.annocations.PageX)")
    public void point(){}
    //环绕通知
    @Around("point()")
    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;
 

@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。

@RestControllerAdvice
public class MyResponseAdvice implements ResponseBodyAdvice<Object> {
    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        return true;
    }
  @ExceptionHandler(Exception.class)
  public Object handleException(Exception e){
        e.printStackTrace();
        if (e instanceof BziException){
            BziException bziException = (BziException) e;
            return ResponseDTO.error(bziException.getCode(),bziException.getMsg());
        }
        return ResponseDTO.error(501,e.getMessage());
  }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
       ResponseDTO dto = ResponseDTO.success(body);
       if (body instanceof  ResponseDTO){
           return body;
       }
       if (body instanceof Page){
           Page page=(Page) body;
           long total = page.getTotal();
           HashMap<String,Object> map=new HashMap<>();
           map.put("total",total);
           map.put("item",body);
           dto = ResponseDTO.success(map);
       }
        LocalUserUtil.remove();//撕掉标签
       if( aClass == StringHttpMessageConverter.class){
           return JSONUtil.toJsonStr(dto);
       }
        return dto;
    }
}

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

@Data
@ConfigurationProperties(prefix = "com.by.pagex")
@EnableAutoConfiguration
public class PageXProperties {
    private boolean enable=true;
}

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

@Configuration
@Import({PageXAOP.class, MyResponseAdvice.class})
@ConditionalOnProperty(prefix = "com.by.pagex",value ="enable",havingValue = "true",matchIfMissing = true)
public class PageXAutoConfiguration {

}

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

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.by.pagex.autoconfiguration.PageXAutoConfiguration

8.如何打包发布??

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

1. 打开云效

2.点击 非生产库-snapshotmave 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包,别人就可以直接使用了。

<dependency>
  <groupId>com.by</groupId>
  <artifactId>zhy-pagex-spring-boot-start</artifactId>
  <version>0.0.1-SNAPSHOT</version>
</dependency>

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>

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

redis的设计与实现(四)——单机数据库特性

1. 前言 我们前面了解了redis的数据结构&#xff0c;对象。但是redis对于这些对象的使用和管理策略需要也熟记于心&#xff0c;这篇文章我们就了解一下吧。 2. 类型检查和命令多态 DEL,EXPIRE,RENAME,TYPE,OBJECT 可以对任何数据类型执行SET,GET,APPEND,STRLEN&#xff0c;等…

【opencv】教程代码 —ImgProc (10)图像平滑处理

10. Smoothing.cpp 图像平滑处理 演示不同滤波器的效果。这些滤波器包括均值滤波、高斯滤波、中值滤波和双边滤波。每个滤波器都会在原始图像上应用&#xff0c;并显示滤波后的效果。 /*** 文件 Smoothing.cpp* 简单滤镜的样例代码* 作者 OpenCV团队*///引入所需库文件 #includ…

PL/SQL的词法单元

目录 字符集 标识符 分隔符 注释 oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 PL/SQL块中的每一条语句都必须以分号结束。 一个SQL语句可以跨多行&#xff0c;但分号表示该语句的结束:一行中也可以有多条 SQL语句&…

一周学会Django5 Python Web开发-Django5模型查询(上)

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计41条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

NLP深入学习:结合源码详解 BERT 模型(三)

文章目录 1. 前言2. 预训练2.1 modeling.BertModel2.1.1 embedding_lookup2.1.2 embedding_postprocessor2.1.3 transformer_model 2.2 get_masked_lm_output2.3 get_next_sentence_output2.4 训练 3. 参考 1. 前言 前情提要&#xff1a; 《NLP深入学习&#xff1a;结合源码详…

2024年N1叉车司机证考试题库及N1叉车司机试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年N1叉车司机证考试题库及N1叉车司机试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大纲随机出的…

串口通信标准RS232 RS485 RS422的区别

RS-232、RS-422、RS-485是关于串口通讯的一个机械和电气接口标准&#xff08;顶多是网络协议中的物理层&#xff09;&#xff0c;不是通讯协议&#xff0c;它们之间的几个不同点如下&#xff1a; 一、硬件管脚接口定义不同 二、工作方式不同 RS232&#xff1a; 3线全双工 RS…

在线教学软件推荐!一站式白板让线上教学更顺畅!

可以用于线上教学的软件&#xff0c;之前大家最为熟悉的莫过于使用各类视频会议软件&#xff0c;如腾讯会议、钉钉会议、飞书会议、Zoom 等&#xff0c;基于视频会议软件来共享电脑屏幕&#xff0c;然后再切换到本地的 PPT 演示文稿进行讲解。 但采用这个线上教学方案存在一些…

如何用磁力仪探测管缆的位置和埋深?

不论是航空磁测&#xff0c;还是海洋磁测&#xff0c;都是直接测量磁场总强度T&#xff0c;而后以总磁异常ΔT成图。磁异常总强度Ta是磁场总强度T与正常场T0的矢量差&#xff0c;即&#xff1a; Ta&#xff1d; T&#xff0d; T0 根据参考文献1&#xff0c;2的推导&#xff0c…

2024信息通信展览会|中国通信展览会|通讯大会

2024信息通信展览会|中国通信展览会|通讯大会 2024年中国国际信息通信展览会与同期举办的ICT.中国论坛于2024年9月25-27日在北京.国家会议中心隆重举办&#xff0c;共同奋力开启信息通信的新篇章。这是一场集交流、展示、共赢于一体的盛大盛典&#xff0c;为信息通信领域的企业…

保研线性代数机器学习基础复习2

1.什么是群&#xff08;Group&#xff09;&#xff1f; 对于一个集合 G 以及集合上的操作 &#xff0c;如果G G-> G&#xff0c;那么称&#xff08;G&#xff0c;&#xff09;为一个群&#xff0c;并且满足如下性质&#xff1a; 封闭性&#xff1a;结合性&#xff1a;中性…

一种重要却容易被我们忽略的能力

你有多久没有「发呆」过了&#xff1f; 我指的不是那种偶尔的走神和分心&#xff0c;而是那种持续一段时间&#xff0c;什么也不做、什么也不想&#xff0c;就这样静静站着或坐着&#xff0c;让大脑放空的状态。 可能有人会觉得&#xff1a;这太奢侈了&#xff0c;我们每天都恨…

【任职资格】某大型制造型企业任职资格体系项目纪实

该企业以业绩、责任、能力为导向&#xff0c;确定了分层分类的整体薪酬模式&#xff0c;但是每一名员工到底应该拿多少工资&#xff0c;同一个岗位的人员是否应该拿同样的工资是管理人员比较头疼的事情。华恒智信顾问认为&#xff0c;通过任职资格评价能实现真正的人岗匹配&…

基于Spring boot + Vue协同过滤算法的电影推荐系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

分享一下自己成功入职为AIGC工程师的经历

据外媒援引知情人士消息&#xff0c;OpenAI预计2023年收入将达到2亿美元&#xff0c;到2024年将达到10亿美元&#xff0c;全世界都看出了AIGC工程师的市场潜力。 而对于广大职场人士而言&#xff0c;则是意味着新的职场机遇出现了&#xff0c;学习好AIGC技术&#xff0c;无论是…

gemma 大模型(gemma 2B,gemma 7B)微调及基本使用

待整理… gemma介绍 Gemma是Google推出的一系列轻量级、最先进的开放模型&#xff0c;基于创建Gemini模型的相同研究和技术构建。提供了 2B 和 7B 两种不同规模的版本&#xff0c;每种都包含了预训练基础版本和经过指令优化的版本。所有版本均可在各类消费级硬件上运行&#x…

ThreadLocal和Synchronized的区别

目录 背景过程ThreadLocal什么是ThreadLocal&#xff1f;既然都是保证线程访问的安全性&#xff0c;那么和Synchronized区别是什么呢&#xff1f;ThreadLocal的使用TheadLocal使用场景原理高并发场景下ThreadLocal会造成内存泄漏吗&#xff1f;什么原因导致&#xff1f;如何避免…

aws 入门篇 01.aws学习的方法论

aws入门篇 01.aws学习的方法论 第1章 aws学习的方法论 aws的服务很多&#xff0c;现在应该有100多个服务了&#xff0c;怎么来学习aws呢&#xff1f; 这几年也使用了一些aws的服务&#xff0c;谈谈自己对学习aws的理解。 1.先横向&#xff0c;后纵深 比如说&#xff0c;aws最…

SpringCloud微服务集成Dubbo

1、Dubbo介绍 Apache Dubbo 是一款易用、高性能的 WEB 和 RPC 框架,同时为构建企业级微服务提供服务发现、流量治理、可观测、认证鉴权等能力、工具与最佳实践。用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服…

手撕算法-最小覆盖子串

描述 分析 滑动窗口。 参考力扣官方的题解思路 本问题要求我们返回字符串 s 中包含字符串 t 的全部字符的最小窗口。我们称包含 t 的全部字母的窗口为「可行」窗口。 我们可以用滑动窗口的思想解决这个问题。在滑动窗口类型的问题中都会有两个指针&#xff0c;一个用于「延伸…
最新文章