Starter的出现极大的方便了SpringBoot对各项依赖的集成


前言

Spring Boot项目的快速发展与流行,很大程度依赖于Starter的出现。Starter方便了Spring各项依赖的集成通过Starter,可以在Spring Boot中获取到所需相关技术的一站式支持(依赖、相关的自动配置文件和相关的 Bean),而无需通过实例代码和复制粘贴来获取依赖。


一、什么场景需要自定义一个Starter?

大型开发团队中,往往会细分多个不同研发方向的基础研发组、应用组、业务组等(举例)。基础研发组的作用可能就是为整个团队提供基础依赖,包括不同缓存使用的封装、不同数据库使用的封装、算法的封装,如何做到团队快速的引入各自需要的依赖呢?

就可以直接引入基础研发组开发的针对各个场景的Starter,做到快速加入到各自的项目组中,省去了每个项目组重新配置的步骤。

二、使用步骤

接下来演示做一个地址日志过滤器Starter的步骤

1.新建一个SpringBoot项目,导入依赖

因为过滤器属于 Serlvet包中的类,所以需要引入 Spring WebMvc 相关依赖

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.6.8</version>--本版按照实际情况设置
        </dependency>

2.定义过滤器

定义LogFilter地址日志过滤器,代码如下:

public class LogFilter implements Filter {
    private Logger logger = LoggerFactory.getLogger(LogFilter.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        logger.info("自定义地址日志过滤器初始化 ...");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        logger.info("uri {} 工作中.", request.getRequestURI());
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        logger.info("自定义地址日志过滤器销毁...");
    }
}

3.定义LogFilterRegistrationBean

定义 LogFilterRegistrationBean用于将 LogFilter 过滤器封装成Spring Bean,具体代码如下:

public class LogFilterRegistrationBean extends FilterRegistrationBean<LogFilter> {
    public LogFilterRegistrationBean() {
        super();
        this.setFilter(new LogFilter());
        this.addUrlPatterns("/*");
        this.setName("自定义地址日志过滤器");
        this.setOrder(1);
    }
}

4.定义自动配置类

定义一个自动配置类将 LogFilterRegistrationBean 注人到 Spring 的上下文中,具体代码如下:

@Configuration
@ConditionalOnClass({LogFilterRegistrationBean.class, LogFilter.class})
public class LogFilterAutoConfiguration {
    @Bean
    @ConditionalOnMissingBean(LogFilterRegistrationBean.class)
    public LogFilterRegistrationBean logFilterRegistrationBean() {
        return new LogFilterRegistrationBean();
    }
}

@Configuration 通常与 @Bean 相配合,使用这两个注解可以创建一个简单的 Spring配置类,代替相应的 xml配置文件。@ConditionalOnClass 声明只有当某个或某些 class 位于类路径上,才会实例化一个 Bean。如上述代码中只有当LogFilterRegistrationBean 和LogFilter 的 class 在类路径上,LogFilterAutoConfiguration 配置类才会生效。

添加@Bean 注解的方法将返回一个对象,该对象会被注册为 Spring 上下文中的 Bean。@ConditionalOnMissingBean 声明仅仅在当前 Spring 上下文中不存在某个对象时,才会实例化一个 Bean。上述代码中,当 LogFilterRegistrationBean 不存在于 Spring 上下文时,才会创建 LogFilterRegistrationBean 的 Bean 并注人到Spring 上下文中。

5.定义使自动配置类生效的注解

然后我们需要一个注解使 LogFilterAutoConfiguration 配置类生效。因为 Starter 是通过jar 包的方式引人项目中,对应的 classes 并不在项目的 Spring 扫描范围内,所以无法自动引人项目的Spring 管理中。对此需要用额外的方式将 LogFilterAutoConfiguration 引人到项目的 Spring 管理中,如通过注解的方式将配置类引入项目的 Spring 扫描范围内。

定义EnableLogFilter引人 LogFilterAutoConfiguration 配置类到项目的 Spring 扫描范围内,具体代码如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(LogFilterAutoConfiguration.class)//引入LogFilterAutoConfiguration配置类
public @interface EnableLogFilter {
}

6.使用Starter

博主用的是方法是将该日志starter项目安装到本地maven仓库,让后引入本地依赖的方式使用。大家可以按实际使用情况使用,如将包安装到私有库中供下载引用依赖。

6.1maven install安装包到本地仓库

在这里插入图片描述

6.2引用Starter

        <dependency>
            <groupId>org.xwy</groupId>
            <artifactId>CustomizeFilterLogStarter</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>E:\new\maven_repository\org\xwy\CustomizeFilterLogStarter\1.0\CustomizeFilterLogStarter-1.0.jar</systemPath>
        </dependency>

6.3注解@EnableLogFilter启用日志地址过滤器

@SpringBootApplication
@EnableLogFilter//启用日志地址过滤器
public class ClientServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(ClientServiceApplication.class, args);
    }

}

6.4效果

项目启动:
在这里插入图片描述
访问接口时
在这里插入图片描述


总结

1.新建一个SpringBoot项目,导入依赖
2.定义过滤器
3.定义LogFilterRegistrationBean
4.定义自动配置类
5.定义使自动配置类生效的注解
6.使用Starter
6.1maven install安装包到本地仓库
6.2引用Starter
6.3注解@EnableLogFilter启用日志地址过滤器
6.4效果


版权声明:本文为qq_37279783原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_37279783/article/details/128920440