上一篇文章说明了如何覆盖自动配置,但是,很多时候我们是不需要把自动配置配置全部覆盖的。比如,我只是想改一个日志的级别,或者改一个端口号,或者设置一个数据库的链接,如果为了这些小事,而抛弃自动配置,那就得不偿失了。下面我们先小试牛刀,试着改一下端口号,这个其实在前面改过了。在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