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。让我们看看如何使用这种属性配置机制来微调自己的应用程序组件。

上一篇:基于阿里云IoT组件搭建车联网基础平台


下一篇:springboot学习与回顾-创建一个springboot项目