vlambda博客
学习文章列表

自定义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让别人引入即可使用