本节主要描述SB里面的常见配置
[TOC]
不使用推荐配置
通常在公司,团队协作的时候,需要使用公司统一的依赖包,比如我们在开发微服务,以及多模块项目的时候,就直接面对了这个问题。
这个时候就不需要使用parent了,需要在maven中的引用自己的dependencyManagement。
这样可以解决问题,但是很多东西就需要手工配置了,比如java版本号、编码格式都需要在pom中自定义实现。
查看springboot构建版本默认的配置,如下
再次解释下@Spring BootApplication
这个是在启动类上的注解,他是一个组合注解,包含三个点
- 表明是配置类
- 表明是自动配置类
- 表明是扫描器:扫描当前类所在包的下级目录。
通常,扫描器扫描是依靠在被扫描对象上的注解进行识别的,被扫描对象注解如下:
- @Service
- @Repository
- @Component
- @Controller
- @RestController
- @ComponentScan
- @Configuration
- ……
定制的Banner
什么是Banner,就是SpringBoot服务启动的时候,看到的LOGO。
有的时候想自定义一些好看的标号,思路是,利用TXT转艺术字体,然后在rescourses文件夹下建立banner.txt文件,把艺术字体复制进去。
艺术字体转换网站:
导入banner.txt过后,这个文件可能被IDE识别报错,最简单的处理方法是找到Promblem栏,手工把bug删除。
程序员写代码,在某种程度上是一种玄学。一般都要请出佛祖来帮忙,推荐Banner如下:
////////////////////////////////////////////////////////////////////
// _ooOoo_ //
// o8888888o //
// 88" . "88 //
// (| ^_^ |) //
// O\ = /O //
// ____/`---'\____ //
// .' \\| |// `. //
// / \\||| : |||// \ //
// / _||||| -:- |||||- \ //
// | | \\\ - /// | | //
// | \_| ''\---/'' | | //
// \ .-\__ `-` ___/-. / //
// ___`. .' /--.--\ `. . ___ //
// ."" '< `.___\_<|>_/___.' >'"". //
// | | : `- \`.;`\ _ /`;.`/ - ` : | | //
// \ \ `-. \_ __\ /__ _/ .-` / / //
// ========`-.____`-.___\_____/___.-`____.-'======== //
// `=---=' //
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
// 佛祖保佑 永无BUG 永不修改 //
////////////////////////////////////////////////////////////////////
当然,你也可以关闭这个Banner,具体做法是在启动类中,利用SpringApplicationBuilder类进行操作,如下:
public static void app(String[] args){
SpringApplicationBuilder builder = new SpringAPplicationBUilder(Chapter012APplication.class);
builder.bannerMode(Banner.Mode.OFF).run(args);
}
笔者在操作关闭Banner的时候出现2个问题
- Banner对象需要手工导入包,无提示导入
import org.springframework.boot.Banner;
- 可能是我手工banner包导错了,导致出现启动过后有报错日志。
- Banner关闭不生效
——这些都无所谓,我是需要佛祖庇护的。所以根本就不会有关闭banner的事出现。
Web容器配置
默认的web容器,使用的是tomcat,如果你不喜欢,可以安装其他几个容器,比如jetty,以及redhat的Undertow。
Tomcat容器配置
pom中使用spring-boot-starter-web后,默认容器是tomcat。
至于它的配置,都在application.properties中,以server.xxxx开头的项。
这里要提的是,在这里配置session的过期时间:默认是以秒为单位,但有个很有意思的规则,他会按分钟进行舍计算,比如输入了119,默认单位是秒,session生效时间就60秒=1分钟,舍去了不足一分钟的秒时间。
如果直接指定单位为分钟的话,请带单位m
HTTPS配置
HTTPS是一个安全通讯协议,它需要安全证书支持。
一般国际认证的证书,都要钱。阿里云免费提供了证书申请,这是一个很好的事情。
我们这里也可以通过JDK生成一个证书,只不过这个证书不被“浏览器”承认罢了。
使用JDK生成数字证书管理工具:
进入\jdk\bin目录,利用java数字证书管理工具keytool生成证书,需要通过命令行启用:
keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048 -keystore sang.p12 -validity 365
- genkey:创建一个新的密钥
- alias:表示keystore的别名
- keyalg:加密算法使用什么
- keysize:密钥的长度
- keystore:密钥的存放位置
- validity:密钥的有效时间,单位为天
在执行的过程中,需要输入密码,根据提示操作即可。
我们把生成的sang.p12放在项目根目录,然后去application.properties中进行如下配置
server.ssl.key-store=sang.p12
server.ssl.key-alias=tomcathttps
server.ssl.key-store-password=123456
这里需要说一些最后一个参数server.ssl.key-store-password
,这个是在生成证书的时候,命令行中要求输入的密码。
密码在这里是明文诶~~~~,properties加密,利用jasypt,请见
启动server,可以进行https验证了。
由于我们用的是自己颁发的证书,浏览器会提示这个证书它信任不过,然后吧啦一堆什么信息窃取风险。——呵呵。
SpringBoot中是不支持HTTP和HTTPS同时存在的,所以就有利用重定向技术将http重定向到https中去。
重定向HTTP请求到HTTPS
思路就是监听所有接口,重定向到https。
- 写个TomcatConfig类来控制重定向
@Configuration
public class TomcatConfig{
@Bean
TomcatServletWebServerFactory tomcatServletWebServerFactory(){
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(){
@Override
protected void postProcessContext(Context context){
SecurityConstraint constraint = new SecurityConstraint();
constraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/");
constraint.addCollection(collection);
context.addConstraint(constraint);
}
};
factory.addAdditionalTomcatConnectors(createTomcatConnector());
return factory;
}
private Connector createTomcatConnector(){
Connector connector = new Connector("org.apache.coyote.http11,Http11NioProtocol");
connector.setScheme("http");
connector.setPort(80); // 监听端口80(默认不输端口,则为80端口)
connector.setSecure(false);
connector.setRedirectPort(8081); // 8081是我们配置的http server安全端口
return connector;
}
}
- Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。请见这篇博文的解释
- 如果要监听多个端口,请见
- 这段代码要放在启动类同级或者子目录下才能生效
- @Configuration相当于一个配置文件。这里就是一个tomcat的重定向配置文件
Context包的导入项挺多,请用
import org.apache.catalina.Context;
Jetty配置
Jetty的配置,也在pom.xml中进行maven配置:
- 先在pom中先除去tomcat,使用
exclusions
标签,在spring-boot-starter-web中去掉tomcat。 - 引入jetty的依赖
……
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
……
Undertow配置
Undertow是RedHat的开元java服务器,有非常好的性能。其配置方式根Jetty一样。关键artifactId为:
spring-boot-starter-undertow
Properties配置
SpringBoot采用了大量自动化配置,对于开发者而言,在实际项目中不可避免会有一些需要自己手动配置的地方。这些自定义的文件,都在resources目录下的application.properties文件中。
四个properties文件以及他们的读取规则
在SB项目中,application.properties文件会出现在4个地方,分别是:
- ./config/
- ./src/
- ./src/main/resources/config/
- ./src/main/resources/
这四个地方,配置文件的读取优先级如排序(出现冲突的时候,优先使用优先级高的properties属性),在书写的时候,还请多多注意。
一般系统里面会生成第四种properties,对于使用场景,目前一个properties应该就足够了,如果有其他场景需求,请读者也请告知我,谢谢。
类型安全配置属性
无论Properties配置,还是YAML配置,最终都会被家在到Spring Environment中。
Spring提供了@Value注解等方式将Environment中的数据注入到属性上,Spring提供了非常安全的机制,就算是大数据的情况下也可以方便的把配置文件中的输入注入到Bean中。
我们在application.properties中写一段配置
book.name=西游记
book.author=吴承恩
book.price=12
现在把这段数据注入到如下Bean中:
@Component
@ConfigurationProperties(prefix="book") // book对应properties中的名字
public class Book{
private String name;
private String author;
private Float price;
// ……getter()/setter()
}
这个Book类的bean,写在那里——想写哪儿写哪儿(启动类的子目录中),别忘了注释即可。
一般这个功能在哪个场景使用?——config中最多了。
在Controller中,我们可以通过@Autowired标签,直接使用
@RestCOntroller
public class BookCOntroller{
@Autowired
Book book; // 通过注解直接使用
@GetMappint("/book")
public String book(){
return book.toString();
}
}
YAML配置
YAML是JSON的超集,专门为写properties而生,它的目标是替代properties。
而且现在已经有很多公司都用YAML替代了properties。
YAML的特点是:
- 简洁
它就一个特点,相对于properties,它在复杂配置的时候,比如写复杂的Bean注入的时候(比如写一个列表),简直比properties好太多了。YAML文件与properties文件比较
YAML的依赖
YAML需求snakeyaml依赖,在我们建立第一个项目,引入spring-boot-starter-web的时候,已经将snakeyaml添加进去了。
YAML的问题
YAML目前的缺点是:无法使用@PropertySource注解加载YAML文件。大家使用的时候,注意一下。如果接受不了,properties也是好的选择。
@PropertySource 这个注解是方便引入properties,请见
学习YAML
替代配置文件,看这篇就够了:YAML快速入门-简书
环境切换-Profile
开发都分开发环境和生产环境,两者之间的配置要求肯定是不一样的。
每次发布的时候都需要进行配置转换,实在太麻烦,现在有了Profile,万事都好说了。
Profile是为了解决环境切换配置要改,导致要动代码问题的。有了它,用命令行就能切换。
创建配置文件
在resouces目录下创建2个文件:application-dev.properties
,application-prod.properties
,在里面写清楚需要环境切换时候的配置:
比如,
server.port=80 // 生产环境properties文件书写
server.port=8080 // 开发环境properties文件书写
配置application.properties
在文件中,写上spring.profiles.active=dev
这表明默认为开发环境。
在代码中配置
如果不想在properties中配置,可以在代码中配置,这里不推荐,也不细说了。大家有兴趣可以自行搜索。
项目启动时配置
java -jar project-01-3-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
启动的时候,如果没有--spring.profiles.active=prod
,就是开发模式。