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

Spring-Boot-Starter

自定义Starter

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

1、创建

1、创建maven工程hello-spring-boot-starter
通用权限系统-Spring-Boot-Starter
2、pom中添加依赖

<?xml version="1.0" encoding="UTF-8"?> <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.0</modelVersion>      <groupId>org.example</groupId>     <artifactId>hello-spring-boot-starter</artifactId>     <version>1.0-SNAPSHOT</version>      <properties>         <maven.compiler.source>8</maven.compiler.source>         <maven.compiler.target>8</maven.compiler.target>         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>     </properties>     <parent>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-starter-parent</artifactId>         <version>2.2.2.RELEASE</version>         <relativePath/>     </parent>     <dependencies>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter</artifactId>         </dependency>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-autoconfigure</artifactId>         </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仓库中
通用权限系统-Spring-Boot-Starter

2、使用

1、创建项目,导入自定义starter
通用权限系统-Spring-Boot-Starter

2、创建application.yml配置文件
通用权限系统-Spring-Boot-Starter
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、测试
通用权限系统-Spring-Boot-Starter

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

1、创建

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

<?xml version="1.0" encoding="UTF-8"?> <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.0</modelVersion>     <parent>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-starter-parent</artifactId>         <version>2.2.2.RELEASE</version>         <relativePath/>     </parent>     <groupId>org.example</groupId>     <artifactId>log-spring-boot-starter</artifactId>     <version>1.0-SNAPSHOT</version>      <properties>         <maven.compiler.source>8</maven.compiler.source>         <maven.compiler.target>8</maven.compiler.target>         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>     </properties>     <dependencies>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter</artifactId>         </dependency>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-autoconfigure</artifactId>         </dependency>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-web</artifactId>         </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<Long> 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如下:

<?xml version="1.0" encoding="UTF-8"?> <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.0</modelVersion>      <groupId>org.example</groupId>     <artifactId>use-my-spring-boot-starter-demo</artifactId>     <version>1.0-SNAPSHOT</version>     <parent>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-starter-parent</artifactId>         <version>2.2.2.RELEASE</version>         <relativePath/>     </parent>     <properties>         <maven.compiler.source>8</maven.compiler.source>         <maven.compiler.target>8</maven.compiler.target>         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>     </properties>     <dependencies>         <dependency>             <groupId>org.example</groupId>             <artifactId>log-spring-boot-starter</artifactId>             <version>1.0-SNAPSHOT</version>         </dependency>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-web</artifactId>         </dependency>         <dependency>             <groupId>org.example</groupId>             <artifactId>hello-spring-boot-starter</artifactId>             <version>1.0-SNAPSHOT</version>         </dependency>     </dependencies>  </project> 

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、测试
通用权限系统-Spring-Boot-Starter

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

发表评论

评论已关闭。

相关文章