通用权限系统-Spring-Boot-Starter
Spring-Boot-Starter
自定义Starter
案例一:读取application.yml中的参数
1、创建
1、创建maven工程hello-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仓库中
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项目并且引入依赖
<?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、测试
到这里,对于自定义starter的案例就结束了。
posted on 2023-07-08 20:40 JavaCoderPan 阅读(343) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了