02-Spring Boot的基础配置

作者: 梁寅plus | 来源:发表于2019-07-03 18:25 被阅读0次

本节主要描述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,就是开发模式。

相关文章

  • 02-Spring Boot的基础配置

    本节主要描述SB里面的常见配置 [TOC] 不使用推荐配置 通常在公司,团队协作的时候,需要使用公司统一的依赖包,...

  • 2019-08-09

    Spring Boot 基础配置 一、端口设置 配置文件直接配置application.properties: a...

  • Spring Boot 开发实战-封装微信 SDK 之开发环境搭

    本文将介绍 Spring Boot 的开发环境搭建及基础环境配置 Spring Boot 项目创建 如果你使用的 ...

  • 一年了,我们都用 Spring Cloud 干了啥?

    一、微服务构建框架 Spring Boot 配置 Spring Boot 是一个在 Spring 的基础上面做了很...

  • Spring Boot基础、Spring Boot核心

    一、Spring Boot基础 Spring Boot优点: 1.快速构建项目。 2.对主流开发框架的无配置继承。...

  • 12-SpringBoot

    一、基础配置 1.1 配置优先级 Spring Boot启动会扫描以下位置的application.propert...

  • Boot初体验-就那么回事儿

    Spring-Boot初体验 基础配置 环境配置java环境>>>1.8maven环境>>>3.5IDE编辑器>>...

  • spring boot基础配置

    由于这张比较简单,我画了个思维导图,这样大家可以很明白我们这一张具体内容是做什么。 代码git地址:https:/...

  • 【Spring Boot】基础配置

    开发web应用的基础配置 设置SpringBoot应用程序 使用内嵌容器时,需要设置SpringBoot应用程序。...

  • 简书一

    spring boot 微服务整合javaMail,实现邮件发送 一、基础配置 1.引入邮件发送依赖 2.主配置文...

网友评论

    本文标题:02-Spring Boot的基础配置

    本文链接:https://www.haomeiwen.com/subject/cobchctx.html