springboot 自动配置微调

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: springboot、 自动配置

在处理应用安全时,我们当然希望完全掌握所有的配置。但是为了微调一些细节,我们就放弃自动配置的话。显得有些因噎废食。

springboot 自动配置的bean提供了300多个用户微调的属性。当我们要调整设置时,只要在环境变量、java系统属性、JNDI、命令行参数或者属性文件里进行指定就好了。

Spring Boot能从多种属性源获得属性,包括如下几处。(1) 命令行参数(2)  java:comp/env 里的JNDI属性(3) JVM系统属性(4) 操作系统环境变量(5) 随机生成的带 random.* 前缀的属性(在设置其他属性时,可以引用它们,比如 ${random.long} )(6) 应用程序以外的application.properties或者appliaction.yml文件(7) 打包在应用程序内的application.properties或者appliaction.yml文件(8) 通过 @PropertySource 标注的属性源(9) 默认属性这个列表按照优先级排序,也就是说,任何在高优先级属性源里设置的属性都会覆盖低优先级的相同属性。例如,命令行参数会覆盖其他属性源里的属性。application.properties和application.yml文件能放在以下四个位置。(1) 外置,在相对于应用程序运行目录的/config子目录里。(2) 外置,在应用程序运行的目录里。(3) 内置,在config包内。(4) 内置,在Classpath根目录。同样,这个列表按照优先级排序。也就是说,/config子目录里的application.properties会覆盖应用程序Classpath里的application.properties中的相同属性。此外,如果你在同一优先级位置同时有application.properties和application.yml,那么application.yml里的属性会覆盖application.properties里的属性。

自动配置微调

(1) 禁用模板缓存

如果阅读列表应用程序经过了几番修改,我们注意到,除非重启应用程序,否则对Thymeleaf模板的变更是不会生效的。这是因为Thymeleaf模板默认缓存。这有助于改善应用程序的性能,因为模板只需编译一次,但在开发过程中就不能实时看到变更的效果了。将 spring.thymeleaf.cache 设置为 false 就能禁用Thymeleaf模板缓存。在命令行里运行应用程序时,将其设置为命令行参数即可:$ java -jar readinglist-0.0.1-SNAPSHOT.jar --spring.thymeleaf.cache=false或者,如果你希望每次运行时都禁用缓存,可以创建一个application.yml,包含以下内容:spring:thymeleaf:cache: false你一定要确保这个文件不会发布到生产环境,否则生产环境里的应用程序就无法享受模板缓存带来的性能提升了。作为开发者,在修改模板时始终关闭缓存实在太方便了。为此,可以通过环境变量来禁用Thymeleaf缓存:$ export spring_thymeleaf_cache=false此处使用Thymeleaf作为应用程序的视图,Spring Boot支持的其他模板也能关闭模板缓存,设置这些属性就好了:  spring.freemarker.cache (Freemarker)  spring.groovy.template.cache (Groovy模板)  spring.velocity.cache (Velocity)默认情况下,这些属性都为 true ,也就是开启缓存。将它们设置为 false 即可禁用缓存。

(2)配置嵌入式服务器

从命令行(或者Spring Tool Suite)运行Spring Boot应用程序时,应用程序会启动一个嵌入式的服务器(默认是Tomcat),监听8080端口。大部分情况下这样挺好,但同时运行多个应用程序可能会有问题。要是所有应用程序都试着让Tomcat服务器监听同一个端口,在启动第二个应用程序时就会有冲突。无论出于什么原因,让服务器监听不同的端口,你所要做的就是设置 server.port 属性。要是只改一次,可以用命令行参数:$ java -jar readinglist-0.0.1-SNAPSHOT.jar --server.port=8000但如果希望端口变更时间更长一点,可以在其他支持的配置位置上设置 server.port 。例如,把它放在应用程序Classpath根目录的application.yml文件里:server:    port: 8000除了服务器的端口,你还可能希望服务器提供HTTPS服务。为此,第一步就是用JDK的keytool 工具来创建一个密钥存储(keystore):$ keytool -keystore mykeys.jks -genkey -alias tomcat -keyalg RSA该工具会询问几个与名字和组织相关的问题,大部分都无关紧要。但在被问到密码时,一定要记住你的选择。在本例中,我选择letmein作为密码。现在只需要设置几个属性就能开启嵌入式服务器的HTTPS服务了。可以把它们都配置在命令行里,但这样太不方便了。可以把它们放在application.properties或application.yml里。在application.yml中,它们可能是这样的:server:port: 8443ssl:key-store: file:///path/to/mykeys.jks

key-store-password: letmeinkey-password: letmein此处的 server.port 设置为8443,开发环境的HTTPS服务器大多会选这个端口。server.ssl.key-store 属性指向密钥存储文件的存放路径。这里用了一个file://开头的URL,从文件系统里加载该文件。你也可以把它打包在应用程序的JAR文件里,用 classpath: URL 来引用它。 server.ssl.key-store-password 和 server.ssl.key-password 设置为创建该文件时给定的密码。有了这些属性,应用程序就能在8443端口上监听HTTPS请求了。(根据你所用的浏览器,可能会出现警告框提示该服务器无法验证其身份。在开发时,访问的是localhost,这没什么好担心的。)

(3)配置日志

大多数应用程序都提供了某种形式的日志。即使你的应用程序不会直接记录日志,你所用的库也会记录它们的活动。默认情况下,Spring Boot会用Logback(http://logback.qos.ch)来记录日志,并用 INFO 级别输出到控制台。在运行应用程序和其他例子时,你应该已经看到很多 INFO 级别的日志了。如果想更换成log4j2后续我们会在写一篇文章来说如何进行springboot的日志配置。

(4)配置数据源

此时,我们还在开发阅读列表应用程序,嵌入式的H2数据库能很好地满足我们的需要。一旦要投放到生产环境,我们可能要考虑更持久的数据库解决方案。虽然我们可以显式配置自己的 DataSource Bean,但通常并不用这么做,只需简单地通过属性配置数据库的URL和身份信息就可以了。举例来说,用的是MySQL数据库,你的application.yml文件看起来可能是这样的:spring:datasource:url: jdbc:mysql://localhost/readinglistusername: dbuserpassword: dbpass通常你都无需指定JDBC驱动,Spring Boot会根据数据库URL识别出需要的驱动,但如果识别出问题了,你还可以设置 spring.datasource.driver-class-name 属性:spring:datasource:url: jdbc:mysql://localhost/readinglist

username: dbuserpassword: dbpassdriver-class-name: com.mysql.jdbc.Driver

在自动配置 DataSource Bean的时候,Spring Boot会使用这里的连接数据。 DataSourceBean是一个连接池,如果Classpath里有Tomcat的连接池 DataSource ,那么就会使用这个连接池;否则,Spring Boot会在Classpath里查找以下连接池:  HikariCP  Commons DBCP  Commons DBCP 2这里列出的只是自动配置支持的连接池,你还可以自己配置 DataSource Bean,使用你喜欢的各种连接池。你也可以设置 spring.datasource.jndi-name 属性,从JNDI里查找 DataSource :spring:datasource:jndi-name: java:/comp/env/jdbc/readingListDS一旦设置了 spring.datasource.jndi-name 属性,其他数据源连接属性都会被忽略,除非没有设置别的数据源连接属性。有很多影响Spring Boot自动配置组件的方法,只需设置一两个属性即可。但这种配置外置的方法并不局限于Spring Boot配置的Bean。让我们看看如何使用这种属性配置机制来微调自己的应用程序组件。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
XML Java 测试技术
SpringBoot入门篇 01、Springboot入门及配置(二)
SpringBoot入门篇 01、Springboot入门及配置(二)
|
NoSQL 安全 Java
SpringBoot 自动配置的原理|学习笔记
快速学习 SpringBoot 自动配置的原理
140 0
SpringBoot 自动配置的原理|学习笔记
|
Java 容器
SpringBoot2.x基础篇:谈谈SpringBoot内提供的这几种配置绑定
`SpringBoot`在不断地版本迭代中陆续提供了不同的配置参数绑定的方式,我们可以单独获取`一个配置参数`也可以将`一系列的配置`映射绑定到`JavaBean`的属性字段,下面我们来看看这几种方式的配置绑定哪一种是你最常用到的。
SpringBoot2.x基础篇:谈谈SpringBoot内提供的这几种配置绑定
SpringBoot使用@ConstructorBinding注解进行配置属性绑定
`SpringBoot2.2`版本发行后一些新的功能也渐渐的浮出了水面,在之前版本`SpringBoot`的配置文件与类之间的属性绑定(`@ConfigurationProperties`)是通过`Setter`方法来进行绑定对应的配置值,而从`2.2`版本开始支持了`构造函数`的方式进行绑定。
|
XML JSON 开发框架
关于SpringBoot的自动配置和启动过程
关于SpringBoot的自动配置和启动过程
关于SpringBoot的自动配置和启动过程
|
Java 容器
SpringBoot的启动配置原理
介绍SpringBoot的启动配置原理
|
运维 NoSQL 小程序
SpringBoot配置文件加密jasypt【数据库配置加密、redis配置加密、核心参数加密】
SpringBoot配置文件加密jasypt【数据库配置加密、redis配置加密、核心参数加密】
329 0
springboot配置webservice服务发布
springboot配置webservice服务发布
335 0
|
存储 安全 网络协议
springboot 配置ssl 实现https访问
springboot 配置ssl 实现https访问
296 0
springboot 配置ssl 实现https访问
|
Java 应用服务中间件
springboot 中配置最大传输数据或上传文件的大小
springboot 中配置最大传输数据或上传文件的大小
springboot 中配置最大传输数据或上传文件的大小