02-Spring Boot的基础配置

本节主要描述SB里面的常见配置

[TOC]


目录.jpg

不使用推荐配置

通常在公司,团队协作的时候,需要使用公司统一的依赖包,比如我们在开发微服务,以及多模块项目的时候,就直接面对了这个问题。

这个时候就不需要使用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个问题

  1. Banner对象需要手工导入包,无提示导入 import org.springframework.boot.Banner;
  2. 可能是我手工banner包导错了,导致出现启动过后有报错日志。
  3. 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的同学,可以先了解下,百度百科专业指导

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个地方,分别是:

  1. ./config/
  2. ./src/
  3. ./src/main/resources/config/
  4. ./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.propertiesapplication-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,就是开发模式。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容