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

来源:互联网 发布:课堂游戏 知乎 编辑:程序博客网 时间:2024/06/05 03:01

引言

通过设置几个简单的配置属性的例子来覆盖自动配置。

最简单的使用属性的应用:设置开启或禁用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:

@Componentpublic class RequestRestUrl{  @Autowired  private AnalysisGaugeSettings analysisGaugeSettings;  public String buildResourceUrl(String url,String parameter){    return analysisGaugeSettings.getEventManage()+url+parameter;  }}

AnalysisResultServiceImpl.java:

@Servicepublic 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或配置类。

举例来说,我们创建的安全配置是针对生产环境的,而自动配置的安全配置用在生产环境。

参看以下:
1

2

3

原创粉丝点击