• Spring Boot 手写starter!!!


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

            原因:简化功能。

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

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

    1. @Target({ElementType.METHOD})
    2. @Retention(RetentionPolicy.RUNTIME)
    3. @Documented
    4. public @interface PageX {
    5. }

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

    1. /*
    2. * Copyright (c) 2020, 2024, All rights reserved.
    3. *
    4. */
    5. package cn.scl.pagex.aop;
    6. import cn.hutool.core.util.ObjectUtil;
    7. import com.github.pagehelper.PageHelper;
    8. import org.aspectj.lang.ProceedingJoinPoint;
    9. import org.aspectj.lang.annotation.Around;
    10. import org.aspectj.lang.annotation.Aspect;
    11. import org.aspectj.lang.annotation.Pointcut;
    12. import org.springframework.stereotype.Component;
    13. import org.springframework.web.context.request.RequestAttributes;
    14. import org.springframework.web.context.request.RequestContextHolder;
    15. import org.springframework.web.context.request.ServletRequestAttributes;
    16. import javax.servlet.http.HttpServletRequest;
    17. /**
    18. *

      Project: pages - PageXAOP

    19. *

      Powered by scl On 2024-02-18 16:32:09

    20. *

      描述:

    21. *
    22. * @author 孙臣龙 [1846080280@qq.com]
    23. * @version 1.0
    24. * @since 17
    25. */
    26. @Component
    27. @Aspect
    28. public class PageXAOP {
    29. @Pointcut("@annotation(cn.scl.core.annotations.PageX)")
    30. public void pointcut(){}
    31. @Around("pointcut()")
    32. public Object around(ProceedingJoinPoint pjp) throws Throwable {
    33. System.out.println("目标方法执行之前");
    34. //获取请求
    35. RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
    36. HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
    37. //获取参数
    38. String pageNum = request.getParameter("pageNum");
    39. String pageSize = request.getParameter("pageSize");
    40. if(ObjectUtil.isNotEmpty(pageNum) && ObjectUtil.isNotEmpty(pageSize) ){
    41. PageHelper.startPage(Integer.parseInt(pageNum),Integer.parseInt(pageSize));
    42. }
    43. Object result = pjp.proceed();//执行目标方法
    44. System.out.println("目标方法执行之后");
    45. return result;
    46. }
    47. }

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

    1. /*
    2. * Copyright (c) 2020, 2024, All rights reserved.
    3. *
    4. */
    5. package cn.scl.model.dto;
    6. import lombok.Data;
    7. /**
    8. *

      Project: pages - ResponseDTO

    9. *

      Powered by scl On 2024-02-18 16:26:38

    10. *

      描述:

    11. *
    12. * @author 孙臣龙 [1846080280@qq.com]
    13. * @version 1.0
    14. * @since 17
    15. */
    16. @Data
    17. public class ResponseDTO {
    18. private int code ; //0为请求成功,非0为请求失败
    19. private String message; //返回的信息
    20. private Object data; //返回的数据
    21. //请求成功调用方法
    22. public static ResponseDTO success(Object data){
    23. ResponseDTO responseDTO = new ResponseDTO();
    24. responseDTO.setCode(0);
    25. responseDTO.setData(data);
    26. return responseDTO;
    27. }
    28. //请求失败调用方法
    29. public static ResponseDTO error(int code,String message){
    30. ResponseDTO responseDTO = new ResponseDTO();
    31. responseDTO.setCode(code);
    32. responseDTO.setMessage(message);
    33. return responseDTO;
    34. }
    35. }

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

    1. /*
    2. * Copyright (c) 2020, 2024, All rights reserved.
    3. *
    4. */
    5. package cn.scl.pagex.advice;
    6. import cn.hutool.json.JSONUtil;
    7. import cn.scl.core.exception.BizException;
    8. import cn.scl.model.dto.ResponseDTO;
    9. import com.github.pagehelper.Page;
    10. import org.springframework.core.MethodParameter;
    11. import org.springframework.http.MediaType;
    12. import org.springframework.http.converter.HttpMessageConverter;
    13. import org.springframework.http.converter.StringHttpMessageConverter;
    14. import org.springframework.http.server.ServerHttpRequest;
    15. import org.springframework.http.server.ServerHttpResponse;
    16. import org.springframework.web.bind.annotation.ExceptionHandler;
    17. import org.springframework.web.bind.annotation.RestControllerAdvice;
    18. import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
    19. import java.util.HashMap;
    20. import java.util.Map;
    21. /**
    22. *

      Project: pages - MyResponseAdvice

    23. *

      Powered by scl On 2024-02-18 16:48:23

    24. *

      描述:

    25. *
    26. * @author 孙臣龙 [1846080280@qq.com]
    27. * @version 1.0
    28. * @since 17
    29. */
    30. @RestControllerAdvice
    31. public class MyResponseAdvice implements ResponseBodyAdvice {
    32. @Override
    33. public boolean supports(MethodParameter methodParameter, Class> aClass) {
    34. return true;
    35. }
    36. @Override
    37. public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
    38. if (body instanceof ResponseDTO){
    39. return body;
    40. }
    41. if (aClass == StringHttpMessageConverter.class){
    42. return JSONUtil.toJsonStr(body);
    43. }
    44. ResponseDTO dto = ResponseDTO.success(body);
    45. if (body instanceof Page) {
    46. Page page = (Page) body;
    47. long total = page.getTotal();
    48. Map m = new HashMap<>();
    49. m.put("total", total);
    50. m.put("item", body);
    51. dto = ResponseDTO.success(m);
    52. }
    53. return dto;
    54. }
    55. }
    56. 5、定义一个属性类,用来是否开启注解,PageXProperties。

      1. /*
      2. * Copyright (c) 2020, 2024, All rights reserved.
      3. *
      4. */
      5. package cn.scl.pagex.properties;
      6. import lombok.Data;
      7. import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
      8. import org.springframework.boot.context.properties.ConfigurationProperties;
      9. /**
      10. *

        Project: scl-root - PageXProperties

      11. *

        Powered by scl On 2024-02-19 16:59:30

      12. *

        描述:

      13. *
      14. * @author 孙臣龙 [1846080280@qq.com]
      15. * @version 1.0
      16. * @since 17
      17. */
      18. @Data
      19. @ConfigurationProperties(prefix = "cn.scl.pagex")
      20. @EnableAutoConfiguration
      21. public class PageXProperties {
      22. private boolean enable=true;
      23. }

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

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

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

      1. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
      2. 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插件

      1. <plugin>
      2. <groupId>org.apache.maven.plugins</groupId>
      3. <artifactId>maven-source-plugin</artifactId>
      4. <executions>
      5. <execution>
      6. <id>attach-sources</id>
      7. <phase>package</phase>
      8. <goals>
      9. <goal>jar</goal>
      10. </goals>
      11. </execution>
      12. </executions>
      13. </plugin>

      XML

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

      目录结构:

    57. 相关阅读:
      react写一个从下往上划出的弹框弹窗组件
      Flink系列之Flink中State设计详解与企业案例实践
      qmake 手册:qmake 入门
      【C语言】八大排序算法
      【技术干货】如何快速创建商用照明 OEM APP?
      【TFS-CLUB社区 第5期赠书活动】〖Python OpenCV从入门到精通〗等你来拿,参与评论,即可有机获得
      【MATLAB源码-第157期】基于matlab的海马优化算法(SHO)机器人栅格路径规划,输出做短路径图和适应度曲线。
      SpringCloud 2022有哪些变化
      【BOOST C++ 13 并行编程】(3) 线程本地存储
      MATLAB|时序数据中的稀疏辅助信号去噪和模式识别
    58. 原文地址:https://blog.csdn.net/qq_64847107/article/details/136271377