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


原文:Johnny小屋