本文将介绍如何从零开始封装自己的starter并且引入到其他项目中使用
为什么要自己封装starter?
这样可以对spring以及其他第三方提供的starter做二次封装或者封装一些自己需要的内容提供给其他项目使用,提高项目级的代码复用性。
首先我们需要新建一个spring-boot项目,为了防止发生maven依赖问题,我们这里不选择任何spring提供的组件,如果添加了请确保引用的项目中没有这个组件。另外不要忘记改maven源
把test文件夹删掉,main目录下创建resources/META-INF/spring.factories文件
把主程序也删掉,我们的starter不需要启动
接下来编写一个拦截器,拦截所有方法并且打印一些内容看看效果
先把pom文件中乱七八糟的东西删干净,并引入一个web模块
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>${spring-boot.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
Config文件
package com.ez4sterben.mytestspringbootstarter.config;
import com.ez4sterben.mytestspringbootstarter.interceptor.MyTestInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 我的测试web mvc配置
*
* @author ez4sterben
* @date 2023/07/18
*/
@Configuration
public class MyTestWebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyTestInterceptor())
.addPathPatterns("/**");
}
}
Interceptor文件
package com.ez4sterben.mytestspringbootstarter.interceptor;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 我的测试拦截器
*
* @author ez4sterben
* @date 2023/07/18
*/
@Component
public class MyTestInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("--------------------starter中的拦截器生效了!------------------------");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
spring.factories文件中加入下面这段内容开启自动配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.ez4sterben.mytestspringbootstarter.config.MyTestWebMvcConfig
目前项目结构如下
打开idea右侧maven依次点击生命周期中的install以及package
打开我们的本地maven仓库
我们的starter已经是jar包的形式了,接下来就打开自己的其他项目来引用这个starter
<dependency>
<groupId>com.ez4sterbengroupId>
<artifactId>mytest-spring-boot-starterartifactId>
<version>0.0.1-SNAPSHOTversion>
dependency>
本文做了一个比较基础的案例,大家可以尝试这种方式封装自己的starter,而且在starter中已经引入了web模块,所以在引入starter的项目中就不用再引入了,通过这种方式可以把在很多项目都固定写的基本内容封装起来,比如通用返回值、基本常量、基本枚举类以及一些统一鉴权和统一异常拦截。可以让这些内容一次配置好后在各个项目中均可以使用。