SpringBoot —— 开发自启动的boot依赖包
开发环境
概述
本文主要记录基于IDEA + Maven开发一个依赖SpringBoot的web项目包并提供给其他项目使用的过程,包括
- 依赖SpringBoot web模块
- 配置SpringBoot项目自动加载Bean
- 自定义的banner展示(banner文件)
- 属性文件读取(兼容不同文件/格式/profiles)
- 过滤器排序
- 打包配置
- 本地安装
- 附录——SpringBoot注解
Juth2-Server
Juth2-Server 是一个基于SpringBoot开发的OAuth2鉴权服务端,下面会以该库为例记录相关内容
pom配置
Juth2-Service是基于HTTP Filter Chain进行request合法验证,涉及到Servlet、Filter注解、Cors处理器等,最简单的方式是直接引入starter-web依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
当然,还需要指定starter-parent,否则你的所有依赖包都必须显式指定版本
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
同样也少不了其他相关依赖包。完成编码后可以通过SpringBootApplication进行启动
自动配置
指依赖包中的@Configuration可以跟随SpringBoot自动启动,而无需额外配置。实现该功能需要启用SpringBoot的自动配置功能,步骤包括
- 在resource目录下创建META-INF目录
- 在目录中创建spring.factories文件
- 在文件中指定自动配置项
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.xxx.Configuration1,\
com.xxx.Configuration2,\
...
banner展示
通常,SpringBoot可以在application.yml中指定banner文件路径。但打包后会被主程序的文件覆盖,可以通过在@Configuration自动加载时读取jar包中的banner文件显示,比如Juth2-Server中
public Juth2Configuration(Juth2Properties juth2Properties, Environment environment) {
//banner
String version = this.getClass().getPackage().getImplementationVersion();
ResourceBanner banner = new ResourceBanner(new ClassPathResource("/juth2-logo.txt"));
banner.printBanner(environment, Juth2Configuration.class, System.out);
System.out.println(" ".repeat(61) + version);
juth2Properties.log();
}
Juth2Configuration使用了构造注入来获取Juth2属性并打印属性加载信息,接着记录如何在jar包中加载主项目的配置信息
加载属性文件
SpringBoot项目可以自动识别 application.yml 或者 application.properties 或者 application-profile.yml 并按照优先级组合文件中的属性。想让自己的jar包实现同样的功能,可以通过SpringBoot提供的属性注解来实现,包括
//实现读取主项目 application 文件中的juth2开头的属性
@ConfigurationProperties(prefix = "juth2",ignoreInvalidFields = true)
//实现读取独立juth2配置文件
@PropertySources({
//读取yml文件,需要配置一个Yaml解析类
@PropertySource(value = {"classpath:juth2.yml", "classpath:config/juth2.yml"}, factory = YamlPropertySourceFactory.class,ignoreResourceNotFound = true, encoding = "UTF-8"),
//读取properties文件
@PropertySource(value = {"classpath:juth2.properties", "classpath:config/juth2.properties"}, ignoreResourceNotFound = true, encoding = "UTF-8")
})
将以上注解标注在属性Bean上,SpringBoot会自动对实例属性进行映射,这样就实现了banner中的Juth2属性注入
过滤器排序
在SpringBoot中,可以通过注解来挂载一个过滤器,比如
@Order(Ordered.LOWEST_PRECEDENCE)
@Component
public class MyFilter implements Filter {
}
通过增加@Component注解来挂载过滤器并通过@Order注解来指定顺序,但Order注解的参数无法使用变量。
另一种方法通过配置类并主动注册来实现,比如
//配置类
@Configuration
public class FilterConfiguration {
//注册过滤器1
@Bean
public FilterRegistrationBean<Filter1> regFilter1() {
final FilterRegistrationBean<Filter1> reg = new FilterRegistrationBean<>();
reg.setFilter(new Filter1());
reg.addUrlPatterns("/*");
reg.setOrder(1);//排序
return reg;
}
//注册过滤器2
@Bean
public FilterRegistrationBean<Filter2> regFilter2() {
final FilterRegistrationBean<Filter2> reg = new FilterRegistrationBean<>();
reg.setFilter(new Filter2());
reg.addUrlPatterns("/*");
reg.setOrder(2);//排序
return reg;
}
}
打包配置
想要打包为类库就不能使用默认的打包插件,如下
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
可以直接删除build或者使用maven-jar插件,如下
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<includes>
<include>**/juth2server/**</include>
<include>**/*.txt</include>
</includes>
</configuration>
</plugin>
</plugins>
</build>
本地安装
build好的jar包需要先在本地测试,IDEA自带了maven工具如下
maven工具
通过install方法,可以把jar包安装在本地maven仓库(通常在C盘 user/.m2目录)
本地maven仓库
然后在主项目的pom文件中加入依赖,比如
<dependency>
<groupId>com.github.holyhigh2</groupId>
<artifactId>juth2-server</artifactId>
<version>0.1.2-SNAPSHOT</version>
</dependency>
版本号由库的pom文件决定并体现在本地库中,比如
本地库版本
然后就可以看到依赖库中已经安装了依赖库
依赖库
附录 - 常用注解
@Component - 标注组件类,实现容器管理,是众多注解的元注解
@Configuration - Bean的配置类,提供@Bean注入。使用@Component元注解
@Bean - 标注返回Bean实例的方法
@RestController - 为所有方法都实现了@ResponseBody的@Controller
@Controller - 标注MVC控制器类。使用@Component元注解
@RequestMapping - 标注控制器类/方法的路由地址
@Service - 标注服务类。使用@Component元注解
@Autowired - 标注需要被注入的Bean
@SpringBootApplication - 用来标注SpringBoot项目启动类,包含了自动配置加载、组件扫描、配置类扫描