SpringBoot-自定义配置-通过属性文件外置配置

 上一篇文章说明了如何覆盖自动配置,但是,很多时候我们是不需要把自动配置配置全部覆盖的。比如,我只是想改一个日志的级别,或者改一个端口号,或者设置一个数据库的链接,如果为了这些小事,而抛弃自动配置,那就得不偿失了。下面我们先小试牛刀,试着改一下端口号,这个其实在前面改过了。在resources目录下有一个application.properties文件,默认这个文件是空的,如果你不需要改什么属性,这个文件是否存在,都不影响程序的运行。但是,如果这个文件存在,Spring boot 在启动的时候会先扫描该文件,看看里边有什么配置,如果有就会启用该配置。这里需要说明一下,能够修改属性的地方非常多,不只是application.properties文件,这个后面再说。

Spring boot 提供了这种微调的属性有300多个,在后面的章节中挑几个常用的操练一下。

1,配置端口号

打开application.properties文件,输入下面的两行代码。

server.port=8000
spring.main.banner-mode=off

第一行代码就像你所知道的一样,就是修改一下网站的访问端口而已。

第二行代码是在程序启动的时候,日志中不要输出一个ascii-art banner的图标。

 

在配置了spring.main.banner-mode=off的属性之后,启动网站的时候不在出现ascii-art 的 “spring” banner 字样。

2,配置数据源

我们以Mysql为例,使用JPA将数据持久化到mysql。一开始,我们选择的数据库是嵌入式的H2数据库,现在我们要改用mysql。那首先应该安装好mysql,并且数据库的登录账户和密码是root/123456。

 先在mysql数据库上创建一个名字为readlist 的数据库,再在数据库中增加一个表Book

CREATE TABLE `book` (
	`id` BIGINT ( 11 ) NOT NULL AUTO_INCREMENT,
	`name` VARCHAR ( 255 ),
	`isbn` VARCHAR ( 255 ),
	`reader` VARCHAR ( 255 ),
	`title` VARCHAR ( 255 ),
	`author` VARCHAR ( 255 ),
	PRIMARY KEY ( `id` ) 
)

下面是重点,我们要application.properties 中修改一下数据库的配置信息,这个根据自己的实际情况配置。

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/readlist?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.max-idle=10
spring.datasource.max-wait=10000
spring.datasource.min-idle=5
spring.datasource.initial-size=5

之前我们是使用嵌入式数据库H2,现在我们要使用mysql 数据库,所以,起步依赖是必须要改的,以maven为例,在pom.xml中增加如下起步依赖配置:

<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
</dependency>

Repository和Entity就没有任何变化,和前几篇文章中用H2数据库时一模一样。 

3,禁用模板缓存

Thymeleaf 模板默认是开启缓存的,这就是您为什么每次修改了Thymeleaf模板build之后,只要不重启应用程序,您在浏览器都不会看到相应的改变,这就是Thymeleaf启动了缓存的原因。如果你从没有关注过,你可以就此做一个测试。

下面我们来关闭Thymeleaf模板的缓存,这个在开发阶段非常重要,你更改了Thymeleaf模板之后,就不需要重启应用程序了,而是build一下就可以了,就可以在浏览器看到更改之后的效果了。

如何开启呢?也是非常的简单还是在application.properties文件中增加下面代码即可。

spring.thymeleaf.cache=false

但是切记,修改了这个配置属性以后,必须要重启应用程序才行,不然这个配置都没有生效,就别谈其他了。

重启之后,现在,您可以尝试修改一下Thymeleaf模板,然后build(Ctrl+F9)一下,不要重启应用程序,在浏览器刷新一下,就可以看到更改了。

切记,千万不要把这个更改发布到生成环境,否则,生成环境的应用程序将无法享受到模板缓存带来的性能提升了。

4,配置HTTPS 

在内嵌的tomcat中配置https,一定是内嵌的tomcat,并且是jar包,如果是war包,应该在服务器中配置。

首先生成证书。 打开命令行,执行如下代码在当前目录下生成一个秘钥存储。

keytool -keystore mytestkey.jks -genkey -alias myhttps -keyalg RSA

将生成的文件mytestkey.jks复制到src/main/resources目录下面。 

 其次增加https的属性配置。我们还是继续打开application.properties 中增加以下配置:

server.port=8000
server.ssl.key-store=classpath:mytestkey.jks
server.ssl.key-alias=myhttps
server.ssl.enabled=true
server.ssl.key-store-password=abcdef
server.ssl.key-password=abcdef
server.ssl.key-store-type=JKS

上面的两个password和alias都是您在生成keystrore时输入的。

这样您启动应用程序,多数情况下是不行的,会报一个 错误:

class path resource [mytestkey.jks] cannot be resolved to URL because it does not exist

 这一般情况是因为maven在将resources中的文件拷贝到class的时候,为了让文件的符号能够更好的兼容多系统,会将文件内某些缺乏兼容性的字符替换为兼容多系统的字符。然而有时候,类似于jks等二进制文件,对文件进行字符替换后文件格式已变,不符合规定,所以会出现报错的情况。为了解决这一个问题,可以在pom.xml中增加如下配置:

 <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>false</filtering>
            </resource>
        </resources>         
  </build>

现在,我们rebuild应用程序,并使用https访问应用程序 

 点击“高级”,继续前往***,就可以看到能够通过https访问 了。

此时,如果是用http访问应用程序,则无法访问。为了解决这一问题,我们增加配置,在用http访问的时候,自动跳转到https访问。

package com.example.myreadlist;

import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class MyreadlistApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyreadlistApplication.class, args);
    }

    /**
     * it's for set http url auto change to https
     */
    @Bean
    public Connector connector(){
        Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(80);
        connector.setSecure(false);
        connector.setRedirectPort(8000);
        return connector;
    }

    @Bean
    public TomcatServletWebServerFactory tomcatServletWebServerFactory(Connector connector){
        TomcatServletWebServerFactory tomcat=new TomcatServletWebServerFactory(){
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint=new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection=new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(connector);
        return tomcat;
    }
}

现在我们可以使用http://localhost/readlist/lg(因为http的默认端口是80,所以此处可以不写)会自动跳转到 https://localhost:8000/readlist/lg

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值