自定义SpringBoot Starter 实现请求日志打印
自定义SpringBoot Starter 实现请求日志打印
本篇主要讲解 如何创建自定义starter 主要为应用添加一个过滤器实现对于请求的路径日志的打印,通过自定义一个starter去更深入了解SpringBoot starter加载过程
1.创建项目
通过IDEA创建一个SpringBoot项目名称 log-out-starter
因为需要添加过滤器属于Servlet包中的类,所以需要引入 Spring Web模块
2.自定义过滤器
自定义一个过滤器,将其请求的路径和参数打印出来
@WebFilter(filterName = "RequestUrlFilter")
@Slf4j
@Component
public class RequestUrlFilter implements Filter {
@Override
public void destroy() {
log.info("【销毁 RequestUrlFilter】");
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest httpServletRequest = (HttpServletRequest) req;
Gson gson = new Gson();
log.info("【请求路径 {} 】", httpServletRequest.getRequestURL());
log.info("【请求参数 {} 】", gson.toJson(httpServletRequest.getParameterMap()));
chain.doFilter(req, resp);
}
@Override
public void init(FilterConfig config) throws ServletException {
log.info("【初始化 RequestUrlFilter】");
}
}
3.自定义自动配置类
@ConditionalOnClass(RequestUrlFilter.class) 只有类路径下存在RequestUrlFilter才加载这个配置类
@ConditionalOnMissingBean(RequestUrlFilter.class) 只有容器中没有RequestUrlFilter Bean的时候才注入
/**
* @author johnny
* @create 2020-03-05 下午10:45
**/
@Configuration
@ConditionalOnClass(RequestUrlFilter.class)
public class RequestUrlFilterAutoConfiguration {
@ConditionalOnMissingBean(RequestUrlFilter.class)
@Bean
public FilterRegistrationBean<RequestUrlFilter> requestUrlFilter() {
FilterRegistrationBean<RequestUrlFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new RequestUrlFilter());
registrationBean.addUrlPatterns("/*");
registrationBean.setName("requestUrlFilter");
registrationBean.setOrder(1);
return registrationBean;
}
}
4.定义使自动配置类生效的注解
关键 @Import(RequestUrlFilterAutoConfiguration.class)
/**
* 使自动配置类RequestUrlFilterAutoConfiguration 生效的注解
* @author johnny
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Import(RequestUrlFilterAutoConfiguration.class)
public @interface EnableLogFilter {
}
完成注解定义后 将其自定义的starter 打包
mvn clean install
5.新建项目引入上面自定义的 starter
新建 logstartertest项目
引入自定义的 starter
<dependency>
<groupId>com.johnny.log</groupId>
<artifactId>log-out-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
在启动类上添加 @EnableLogFilter注解 这个注解会帮我们导入 RequestUrlFilterAutoConfiguration自动配置类 该自动配置类会为我们当前项目添加一个 RequestUrlFilter 用于打印请求日志
@SpringBootApplication
@RestController
@EnableLogFilter
public class LogstartertestApplication {
public static void main(String[] args) {
SpringApplication.run(LogstartertestApplication.class, args);
}
@GetMapping("/hello")
public String hello() {
return "hello";
}
}
6.浏览器访问测试
http://localhost:9003/hello
7.扩展编写 META-INF/spring.factories 文件
我们可以不通过注解的方式引入自动配置类 , 在 resource下面新建 META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.johnny.log.logoutstarter.autoconfig.RequestUrlFilterAutoConfiguration
直接配置 org.springframework.boot.autoconfigure.EnableAutoConfiguration
在SpringBoot启动的时候会扫码所有的 META-INF/spring.factories 中的 EnableAutoConfiguration 配置的自动配置类 所以自定义的starter的自动配置类 也会生效,会自动注入
spring-boot-autoconfigure 就是这样实现的
8.总结
本篇主要讲解 如何创建自定义starter 主要为应用添加一个过滤器实现对于请求的路径日志的打印,通过自定义一个starter去更深入了解SpringBoot starter加载过程,可以通过配置注解引入自动配置类 或者 直接在spring.factories 中配置 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 来让我们的自动配置类生效,所以你可以实现一个功能强大的starter让别人引入即可使用