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效果