赞
踩
本小节我们通过自定义两个starter来加强starter的理解和应用。
开发工具:Idea 2022.3.3
| 步骤 | 描述 | 包名 | 备注 |
|---|---|---|---|
| 1 | idea项目设置 | 配置maven | |
| 2 | 创建starter工程hello-spring-boot-starter | 创建 | |
| 3 | 配置pom.xml 文件 | 配置 | |
| 4 | 创建配置属性类HelloProperties | cn.itcast.config | |
| 5 | 创建服务类HelloService | cn.itcast.service | |
| 6 | 创建自动配置类HelloServiceAutoConfiguration | cn.itcast.config | |
| 7 | 在resources目录下创建META-INF/spring.factories | 配置 | |
| 8 | maven安装hello-spring-boot-starter | 编译、安装 |
第一步:创建starter工程hello-spring-boot-starter并配置pom.xml文件
1) 创建starter工程:hello-spring-boot-starter
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eDcN4PDT-1687850427070)(img/image-20230626153141449.png)]](https://img-blog.csdnimg.cn/89cbd52195bd41f0907a417bbb3e0461.png)
2)配置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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.2.RELEASE</version> <relativePath/> </parent> <groupId>cn.itcast</groupId> <artifactId>hello-spring-boot-starter</artifactId> <version>1.0-SNAPSHOT</version> <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>
第二步:创建配置属性类HelloProperties
package cn.itcast.config; import org.springframework.boot.context.properties.ConfigurationProperties; /* *读取配置文件转换为bean * */ @ConfigurationProperties(prefix = "hello") @EnableConfigurationProperties(value = HelloProperties.class) 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 + '\'' + '}'; } }
第三步:创建服务类HelloService
package cn.itcast.service;
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;
}
}
第四步:创建自动配置类HelloServiceAutoConfiguration
package cn.itcast.config; import cn.itcast.service.HelloService; 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; /* * 配置类,基于Java代码的bean配置 * */ @Configuration @EnableConfigurationProperties(HelloProperties.class) public class HelloServiceAutoConfiguration { private HelloProperties helloProperties; //通过构造方法注入配置属性对象HelloProperties public HelloServiceAutoConfiguration(HelloProperties helloProperties) { this.helloProperties = helloProperties; } //实例化HelloService并载入Spring IoC容器 @Bean @ConditionalOnMissingBean public HelloService helloService(){ return new HelloService(helloProperties.getName(),helloProperties.getAddress()); } }
第五步:在resources目录下创建META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.itcast.config.HelloServiceAutoConfiguration
至此starter已经开发完成了,可以将当前starter安装到本地maven仓库供其他应用来使用。
第6步:设置maven并编译安装start
1)配置maven仓库

2)安装install

编译后的jar包所在目录

步骤列表:
| 步骤 | 描述 | 包名 | 备注 |
|---|---|---|---|
| 1 | 创建maven工程myapp | 创建 | |
| 2 | 配置pom.xml 文件 | 配置 | |
| 3 | 创建application.yml文件 | resources/application.yml | 配置 |
| 4 | 创建HelloController | cn.itcast.controller | |
| 5 | 创建启动类HelloApplication | cn.itcast | |
| 6 | 执行启动类main方法,访问地址http://localhost:8080/hello/say | 配置 |
第一步:创建maven工程myapp并配置pom.xml文件
1)创建maven工程myapp

2)配置maven仓库路径,如果不配置,会在pom.xml引用的时候出错(找不到hello-spring-boot-starter)

3)配置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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.2.RELEASE</version> <relativePath/> </parent> <groupId>cn.itcast</groupId> <artifactId>myapp</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--导入自定义starter--> <dependency> <groupId>cn.itcast</groupId> <artifactId>hello-spring-boot-starter</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project>
第二步:在resources下创建application.yml文件
server:
port: 8080
hello:
name: xiaoming
address: beijing
第三步:创建HelloController
package cn.itcast.controller; import cn.itcast.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; @RestController @RequestMapping("/hello") public class HelloController { //HelloService在我们自定义的starter中已经完成了自动配置,所以此处可以直接注入 @Autowired private HelloService helloService; @GetMapping("/say") public String sayHello(){ return helloService.sayHello(); } }
第四步:创建启动类HelloApplication
package cn.itcast;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HelloApplication {
public static void main(String[] args) {
SpringApplication.run(HelloApplication.class,args);
}
}
执行启动类main方法,访问地址http://localhost:8080/hello/say

在前面的案例一中我们通过定义starter,自动配置了一个HelloService实例。本案例我们需要通过自动配置来创建一个拦截器对象,通过此拦截器对象来实现记录日志功能。
我们可以在案例一的基础上继续开发案例二。
| 步骤 | 描述 | 包名 | 备注 |
|---|---|---|---|
| 1 | 在hello-spring-boot-starter的pom.xml文件中追加如下maven坐标 | hello-spring-boot-starter项目 | |
| 2 | 自定义MyLog注解,创建MyLog文件 | cn.itcast.log | hello-spring-boot-starter项目 |
| 3 | 自定义日志拦截器,创建MyLogInterceptor文件 | hello-spring-boot-starter项目 | |
| 4 | 创建自动配置类MyLogAutoConfiguration,用于自动配置拦截器、参数解析器等web组件 | hello-spring-boot-starter项目 | |
| 5 | 在spring.factories中追加MyLogAutoConfiguration配置 | hello-spring-boot-starter项目 | |
| 6 | maven编译安装hello-spring-boot-starter | hello-spring-boot-starter项目 | |
| 7 | 在myapp工程的Controller方法上加入@MyLog注解 | myapp项目 | |
| 8 | 访问地址:http://localhost:8080/hello/say,查看控制台输出 | myapp项目 |
第一步:在hello-spring-boot-starter的pom.xml文件中追加如下maven坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
第二步:自定义MyLog注解
package cn.itcast.log;
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 {
/**
* 方法描述
*/
String desc() default "";
}
第三步:自定义日志拦截器MyLogInterceptor
package cn.itcast.log; 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; /** * 日志拦截器 */ public class MyLogInterceptor extends HandlerInterceptorAdapter { private static final ThreadLocal<Long> startTimeThreadLocal = new ThreadLocal<>(); public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HandlerMethod handlerMethod = (HandlerMethod)handler; Method method = handlerMethod.getMethod();//获得被拦截的方法对象 MyLog myLog = method.getAnnotation(MyLog.class);//获得方法上的注解 if(myLog != null){ //方法上加了MyLog注解,需要进行日志记录 long startTime = System.currentTimeMillis(); startTimeThreadLocal.set(startTime); } return true; } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { HandlerMethod handlerMethod = (HandlerMethod)handler; Method method = handlerMethod.getMethod();//获得被拦截的方法对象 MyLog myLog = method.getAnnotation(MyLog.class);//获得方法上的注解 if(myLog != null){ //方法上加了MyLog注解,需要进行日志记录 long endTime = System.currentTimeMillis(); Long startTime = startTimeThreadLocal.get(); long optTime = endTime - startTime; String requestUri = request.getRequestURI(); String methodName = method.getDeclaringClass().getName() + "." + method.getName(); String methodDesc = myLog.desc(); System.out.println("请求uri:" + requestUri); System.out.println("请求方法名:" + methodName); System.out.println("方法描述:" + methodDesc); System.out.println("方法执行时间:" + optTime + "ms"); } } }
第四步:创建自动配置类MyLogAutoConfiguration,用于自动配置拦截器、参数解析器等web组件
package cn.itcast.config; import cn.itcast.log.MyLogInterceptor; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** * 配置类,用于自动配置拦截器、参数解析器等web组件 */ @Configuration public class MyLogAutoConfiguration implements WebMvcConfigurer{ //注册自定义日志拦截器 public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyLogInterceptor()); } }
第五步:在spring.factories中追加MyLogAutoConfiguration配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.itcast.config.HelloServiceAutoConfiguration,\
cn.itcast.config.MyLogAutoConfiguration
注意:我们在hello-spring-boot-starter中追加了新的内容,需要重新打包安装到maven仓库。
在myapp工程的Controller方法上加入@MyLog注解
package cn.itcast.controller; import cn.itcast.log.MyLog; import cn.itcast.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; @RestController @RequestMapping("/hello") public class HelloController { //HelloService在我们自定义的starter中已经完成了自动配置,所以此处可以直接注入 @Autowired private HelloService helloService; @MyLog(desc = "sayHello方法") //日志记录注解 @GetMapping("/say") public String sayHello(){ return helloService.sayHello(); } }
添加@MyLog如果是红色错误提醒,查看MyLog类是否是public。
访问地址:http://localhost:8080/hello/say,查看控制台输出:

请求uri:/hello/say
请求方法名:cn.itcast.controller.HelloController.sayHello
方法描述:sayHello方法
方法执行时间:36ms
Day02 结束, 后续…
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。