引言
通过设置几个简单的配置属性的例子来覆盖自动配置。
最简单的使用属性的应用:设置开启或禁用Spring Boot的ascii-art Banner(商标)几种方式。
命令行:
$ java -jar demo-0.0.1-SNAPSHOT.jar --spring.main.show-banner=false
application.properties:
spring.main.show-banner=false
application.yml:
spring:
main:
show-banner: false
设置为环境变量。(如果用的是bash或者zsh,使用export命令):
$ export spring_main_show_banner=false
1.微调自动配置的Bean
(1)禁用模板缓存
对于开发者,可以避免修改模板后,需要重启用应用程序才会生效,不能实时的看到变更的效果。
注意:使用文件配置时,确保这个文件不会发布到生产环境,否则生产环境里的应用就无法享受模板缓存带来的性能提升了。
用命令行运行应用程序时,将其设置为命令行参数,只会禁用一次:
$ java -jar demo-0.0.1-SNAPSHOT.jar --spring.thymeleaf.cache=false
application.yml中,每次运行都会被禁用:
spring:
thymeleaf:
cache: false
设置环境变量。
$export spring_thymleaf_cache=false
其他Spring Boot支持的模板也能关闭模板缓存:
Freemarker::spring.freemarker.cache
Groovy:spring.groovy.template.cache
Velovity:spring.velocity.cache
(2)配置嵌入式服务器
从命令行运行或者(Spring Tool Suite)运行Spring Boot应用程序时,应用程序会启动一个嵌入式的服务器(默认是Tomcat),监听8080端口。
当运行多个应用程序时,需要配置不同的监听端口。
命令行设置,只生效一次:
$ java -jar demo-0.0.1-SNAPSHOT.jar --server.port=8000
application.yml:
server:
port: 8000
除了端口,还希望服务器提供HTTPS服务。第一步就是用JDK的keytool工具创建一个密钥存储(keystore):
$ keytool -keystore mykeys.jks -genkey -alias tomcat -keyalg RSA
该工具除了其他无关紧要的问题,当问到密码时,记住选择。如选择letmein
在application.yml中,大多选择8443端口:
server:
port: 8443
ssl:
key-store: file:///path/to/mykeys.jks
key-store-password: letmein
key-password: letmein
配置日志
默认情况下,Spring Boot 使用Logback(http://logback.qos.cn)来记录日志,并用INFO级别输出到控制台。
一般来说,不需要切换日志的实现。Logback能很好的满足需要。如果决定使用Log4j或者Log4j2,只需要修改依赖,引入对应该日志实现的起步不依赖,同时排除掉Logback。
配置数据源
可以显示配置自己的DataSource Bean,但通常并不用这么做,只需要简单的通过属性配置数据库的URL,身份信息等就可以了。一旦投放到生产环境,我们需要考虑更持久的数据库解决方案。
application.yml:
spring:
datasource:
url: jdbc:postgresql://172.18.24.12:5432/ecmsbj
username: ecmsbj
password: ecmsbj
driver-class-name: org.postgresql.Driver
tomcat: #默认使用tomcat连接池配置
max-idle: 10 #数据库允许最大空闲连接数
min-idle: 5 #最小空闲连接数
initial-size: 5 #初始连接数
max-active: 100 #最大激活链接数
数据库连接池:在自动配置DataSource Bean的时候,Spring Boot会使用这里的连接数据。DataSource Bean是一个连接池,如果Classpath里有Tomcat的连接池DataSource,那么就是用这个连接池。否则,Spring Boot 会在Classpath里查找一下连接池:
- HikariCP
- Commons DBCP
- Commons DBCP2
这些都是自动配置的支持的连接池,还可以自己配置DataSource Bean,使用各种连接池。可以设置spring.datasource.jndi-name属性,从JNDI里查找DataSource:
spring:
datasource:
jndi-name: java:/comp/env/jdbc/demoDS
注意:一旦设置了spring.datasource.jndi-name属性,其他数据源连接属性都会被忽略,除非没有设置别的数据源连接属性。
应用程序Bean的配置外置
我们来看一段代码:
AnalysisGaugeSettings.java:
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "AnalysisGaugeSeeds")//属性注入
public class AnalysisGaugeSettings {
//事件管理系统地址
private String eventManage;
public String getEventManage() {
return eventManage;
}
public void setEventManage(String eventManage) {
this.eventManage = eventManage;
}
}
application.yml:
AnalysisGaugeSeeds:
eventManage: http://172.18.24.13:8080/invokemock/api/v1
RequestRestUrl.java:
@Component
public class RequestRestUrl{
@Autowired
private AnalysisGaugeSettings analysisGaugeSettings;
public String buildResourceUrl(String url,String parameter){
return analysisGaugeSettings.getEventManage()+url+parameter;
}
}
AnalysisResultServiceImpl.java:
@Service
public class AnalysisResultServiceImpl implements AnalysisResultService{
@Autowired
private RequestRestUrl requestRestUrl;
@Override
public String queryResultByType(){
//...requestRestUrl.buildResourceUrl(*,*)
}
}
AnalysisResultController.java:
@RestController
@RequestMapping(value="...",produces="application/json")
public class AnalysisResultController{
@Autowired
private AnalysisResultService analysisResultService;
@RequestMapping(value="..",method="...",produces="application/json")
public ResponseEntity<List<AnalysisResult>> findAnalysisResultByType(){
//...analysisResultService.queryResultByType()
}
}
Application.java:
@SpringBootApplication
@EnableConfigurationProperties(AnalysisGaugeSettings.class)
@ComponentScan({"...."})
public class Application{
public static void main(String[] args){
SpringApplication app=new SpringApplication(Application.class);
app.run(args);
}
}
仔细观察就会明白使用的方式,可程序之间调用的关系。
使用Profile进行配置,部署到不同的运行环境
Spring 3.1开始支持基于Profile的配置。Profile是一种条件化配置,基于运行时激活的Profile,使用或者忽略不同的Bean或配置类。
举例来说,我们创建的安全配置是针对生产环境的,而自动配置的安全配置用在生产环境。
参看以下: