• 通用权限系统-Spring-Boot-Starter


    Spring-Boot-Starter

    自定义Starter

    案例一:读取application.yml中的参数

    1、创建

    1、创建maven工程hello-spring-boot-starter
    image
    2、pom中添加依赖

    <project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>
    <groupId>org.examplegroupId>
    <artifactId>hello-spring-boot-starterartifactId>
    <version>1.0-SNAPSHOTversion>
    <properties>
    <maven.compiler.source>8maven.compiler.source>
    <maven.compiler.target>8maven.compiler.target>
    <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    properties>
    <parent>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-parentartifactId>
    <version>2.2.2.RELEASEversion>
    <relativePath/>
    parent>
    <dependencies>
    <dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starterartifactId>
    dependency>
    <dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-autoconfigureartifactId>
    dependency>
    dependencies>
    project>

    3、创建HelloProperties
    配置属性类,用于封装配置文件中配置的参数信息

    package org.example.config;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    /**
    * TODO 配置属性类,用于封装配置文件中配置的参数信息
    *
    * @author ss_419
    * @version 1.0
    * @date 2023/7/8 13:55
    */
    @ConfigurationProperties(prefix = "hello")
    public class HelloProperties {
    private String name;
    private String address;
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public String getAddress() {
    return address;
    }
    public void setAddress(String address) {
    this.address = address;
    }
    @Override
    public String toString() {
    return "HelloProperties{" +
    "name='" + name + '\'' +
    ", address='" + address + '\'' +
    '}';
    }
    }

    4、创建HelloService
    这个类用于对读取到的参数进行一些业务上的操作

    package org.example.service;
    /**
    * TODO
    *
    * @author ss_419
    * @version 1.0
    * @date 2023/7/8 14:03
    */
    public class HelloService {
    private String name;
    private String address;
    public HelloService(String name, String address) {
    this.name = name;
    this.address = address;
    }
    public String sayHello(){
    return "你好!我的名字叫做"+name+",地址是" + address;
    }
    }

    5、创建HelloServiceAutoConfiguration(用于自动配置HelloService对象)

    package org.example.config;
    import org.example.service.HelloService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    /**
    * TODO 自动配置类
    * 通过@Configuration + @Bean 实现自动创建对象
    *
    * @author ss_419
    * @version 1.0
    * @date 2023/7/8 14:06
    */
    @Configuration
    // 一定要加上这个注解,否则Spring找不到这个配置类
    @EnableConfigurationProperties(value = HelloProperties.class)
    public class HelloServiceAutoConfiguration {
    private HelloProperties helloProperties;
    // 通过构造方法注入配置属性对象HelloProperties
    public HelloServiceAutoConfiguration(HelloProperties helloProperties) {
    this.helloProperties = helloProperties;
    }
    // 实例化HelloService并载入Spring IOC 容器
    @Bean
    @ConditionalOnMissingBean// Spring中没有这个实例的时候再去创建
    public HelloService helloService(){
    return new HelloService(helloProperties.getName(), helloProperties.getAddress());
    }
    }

    6、在resources目录下创建META-INF/spring.factories

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    org.example.config.HelloServiceAutoConfiguration

    7、将工程打包到maven仓库中
    image

    2、使用

    1、创建项目,导入自定义starter
    image

    2、创建application.yml配置文件
    image
    3、创建启动类

    package org.example;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    /**
    * TODO
    *
    * @author ss_419
    * @version 1.0
    * @date 2023/7/8 14:39
    */
    @SpringBootApplication
    public class HelloApplication {
    public static void main(String[] args) {
    SpringApplication.run(HelloApplication.class,args);
    }
    }

    4、创建测试Controller

    package org.example.controller;
    import org.example.annotaion.MyLog;
    import org.example.service.HelloService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    /**
    * TODO
    *
    * @author ss_419
    * @version 1.0
    * @date 2023/7/8 14:36
    */
    @RestController
    @RequestMapping("/hello")
    public class HelloController {
    @Autowired
    private HelloService helloService;
    @GetMapping("/sayHello")
    public String sayHello() {
    return helloService.sayHello();
    }
    }

    5、测试
    image

    案例二:通过自动配置来创建一个拦截器对象,通过此拦截器对象来实现记录日志功能

    1、创建

    1、创建maven项目并且引入依赖

    <project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>
    <parent>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-parentartifactId>
    <version>2.2.2.RELEASEversion>
    <relativePath/>
    parent>
    <groupId>org.examplegroupId>
    <artifactId>log-spring-boot-starterartifactId>
    <version>1.0-SNAPSHOTversion>
    <properties>
    <maven.compiler.source>8maven.compiler.source>
    <maven.compiler.target>8maven.compiler.target>
    <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    properties>
    <dependencies>
    <dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starterartifactId>
    dependency>
    <dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-autoconfigureartifactId>
    dependency>
    <dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-webartifactId>
    dependency>
    dependencies>
    project>

    2、创建MyLog注解

    package org.example.annotaion;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MyLog {
    /**
    * 方法描述
    * @return
    */
    String desc() default "";
    }

    3、创建日志拦截器

    package org.example.interceptor;
    import org.example.annotaion.MyLog;
    import org.springframework.web.method.HandlerMethod;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.lang.reflect.Method;
    /**
    * TODO 自定义日志拦截器
    *
    * @author ss_419
    * @version 1.0
    * @date 2023/7/8 17:43
    */
    public class MyLogInterceptor extends HandlerInterceptorAdapter {
    private static final ThreadLocal startTimeThreadLocal = new ThreadLocal<>();// 记录时间毫秒值
    /**
    * 执行之前
    * @param request
    * @param response
    * @param handler
    * @return
    * @throws Exception
    */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    // 进行转换
    HandlerMethod handlerMethod = (HandlerMethod) handler;
    Method method = handlerMethod.getMethod();
    // 获取方法上的注解MyLog
    MyLog annotation = method.getAnnotation(MyLog.class);
    if(annotation != null){
    // 说明当前拦截到的方法上加入了MyLog注解
    long currentTimeMillis = System.currentTimeMillis();
    startTimeThreadLocal.set(currentTimeMillis);
    }
    return true;
    }
    /**
    * 执行之后
    * @param request
    * @param response
    * @param handler
    * @param modelAndView
    * @throws Exception
    */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    HandlerMethod handlerMethod = (HandlerMethod) handler;
    Method method = handlerMethod.getMethod();
    // 获取方法上的注解MyLog
    MyLog annotation = method.getAnnotation(MyLog.class);
    if(annotation != null){
    // 说明当前拦截到的方法上加入了MyLog注解
    Long startTime = startTimeThreadLocal.get();
    long endTime = System.currentTimeMillis();
    long optTime = endTime - startTime;
    String requestUri = request.getRequestURI();
    String methodName = method.getDeclaringClass().getName() + "."+
    method.getName()+"()";
    String methodDesc = annotation.desc();
    System.out.println("请求uri:"+requestUri);
    System.out.println("请求方法名:"+methodName);
    System.out.println("方法描述:"+methodDesc);
    System.out.println("方法执行时间:"+optTime+"ms");
    }
    super.postHandle(request, response, handler, modelAndView);
    }
    }

    4、创建自动装配对象

    package org.example.config;
    import org.example.interceptor.MyLogInterceptor;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    /**
    * TODO
    *
    * @author ss_419
    * @version 1.0
    * @date 2023/7/8 18:08
    */
    @Configuration
    public class MyLogAutoConfiguration implements WebMvcConfigurer {
    /**
    * 注册自定义日志拦截器
    * @param registry
    */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new MyLogInterceptor());
    }
    }

    5、在resources下创建META-INF,在该文件夹下创建spring.factories
    该配置文件用于扫描自动装配类

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    org.example.config.MyLogAutoConfiguration

    2、使用

    1、创建一个web项目,并且引入依赖,pom.xml如下:

    "1.0" encoding="UTF-8"?>
    "http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4.0.0
    org.example
    use-my-spring-boot-starter-demo
    1.0-SNAPSHOT
    org.springframework.boot
    spring-boot-starter-parent
    2.2.2.RELEASE
    8
    8
    UTF-8
    org.example
    log-spring-boot-starter
    1.0-SNAPSHOT
    org.springframework.boot
    spring-boot-starter-web
    org.example
    hello-spring-boot-starter
    1.0-SNAPSHOT

    2、创建测试Controller
    在测试的方法上添加上自定义的MyLog注解,当该方法执行的时候就会在控制台输出对应信息

    package org.example.controller;
    import org.example.annotaion.MyLog;
    import org.example.service.HelloService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    /**
    * TODO
    *
    * @author ss_419
    * @version 1.0
    * @date 2023/7/8 14:36
    */
    @RestController
    @RequestMapping("/hello")
    public class HelloController {
    @Autowired
    private HelloService helloService;
    @GetMapping("/sayHello")
    @MyLog(desc = "sayHello方法")
    public String sayHello() {
    return helloService.sayHello();
    }
    }

    3、测试
    image

    到这里,对于自定义starter的案例就结束了。

  • 相关阅读:
    ChatGPT全方位解析:如何培养 AI 智能对话技能?
    【线下沙龙】低成本高效率构建您的业务系统
    快速排序--简洁的JAVA/PHP实现
    卷积神经网络
    模板(详解)
    VUE前端工程化-2
    搭载TI AM62x处理器,飞凌FET6254-C核心板首发上市!
    Python自动化之定时任务
    blender基本操作
    拓展:赖世雄英语初级美语(上)
  • 原文地址:https://www.cnblogs.com/atwood-pan/p/17537825.html