为什么要手写一个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 , 别人在使用的时候,可以下载源码查看