1.SpringBoot利用自定义注解实现多数据源2.SpringBoot实现限流注解3.SpringBoot整合OSS文件上传
4.通用权限系统-Spring-Boot-Starter
5.通用权限系统-Dozer对象转换6.SpringBoot对接OpenAISpring-Boot-Starter
自定义Starter
案例一:读取application.yml中的参数
1、创建
1、创建maven工程hello-spring-boot-starter
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仓库中
2、使用
1、创建项目,导入自定义starter
2、创建application.yml配置文件
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、测试
案例二:通过自动配置来创建一个拦截器对象,通过此拦截器对象来实现记录日志功能
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、测试
到这里,对于自定义starter的案例就结束了。