SPRING实战(2)、Spring基础之配置

在Spring的XML方式和基于Java的配置中,这两种类型的配置通常会在同一个地方显示声明。在基于Java的配置中,带有@Bean注解的方法一会同事初始化话bean并立即为它的属性设置值。Spring的环境抽象是各种配置属性的一站式服务。它抽取了原始的属性,这样需要这些属性的bean就可以从Spring本身中获取了。Spring环境会拉取多个属性源,包括: JVM系统属性; 操作系统环境变量; 命令行参数; 应用属性配置文件。Spring Boot自动配置的bean都可以通过Spring环境提取的属性进行配置。

Spring的两种装配方式:

bean装配:声明在Spring应用上下文中创建哪些应用组件以及它们之间如何互相注入的配置。

属性注入:设置Spring应用上下文中bean的值的配置。

外部配置属性如指定端口号,那么可以在使用命令行参数启动应用的时候指定端口: $ java -jar tacocloud-0.0.5-SNAPSHOT.jar --server.port=9090。如果你希望应用始终在一个特定的端口启动,那么可以通过操作系统的环境变量进行一次性的设置: $ export SERVER_PORT=9090。

配置数据源时,尽管我们需要将对应 的JDBC驱动添加到构建文件中,但是我们不需要指定JDBC驱动类。Spring Boot会根据数据库URL的结构推算出来。然而,如果这样做有问题的话,我们依然可以通过spring.datasource.driver-class-name属性来进行设置。如果在类路径中存在Tomcat的JDBC连接池,DataSource将使用该连接池。否则,Spring Boot将会在类路径下尝试查找并使用如下的连接池实现:· HikariCP   ·Commons DBCP2。

spring.datasource.schema和spring.datasource.data属性,可以声明应用启动的时候要执行的数据库初始化脚本。如果无法使用显式配置数据源的方式,而是更加倾向于在JNDI(Java Naming and Directory Interface,Java命名和目录接口)中配置数据源并让Spring去那里进行查找,可以使用spring.datasource.jndi-name搭建自己的数据源。如果设置了spring.datasource.jndi-name属性,其他的数据库连接属性(已经设置了的话)就会被忽略。

配置嵌入式数据库

server.port属性显式设置成了0,但是服务器并不会真的在端口0上启动。相反,它会任选一个可用的端口。

对底层容器常见的一项设置就是让它处理HTTPS请求。为了实现这一点,我们首先要使用JDK的keytool命令行工具生成keystore: $ keytool -keystore mykeys.jks -genkey -alias tomcat -keyalg RSA。接下来,我们需要设置一些属性,以便于在嵌入式服务器中启用HTTPS。我们可以在命令行中进行配置,但是这种方式非常不方便,相反,你可能更愿意通过application.properties或application.yml文件来声明配置。在application.yml中,配置属性如下:

server: 
    port: 8443 
    ssl: 
        key-store: file:///path/to/mykeys.jks 
        key-store-password: aaa
        key-password: aaa

  • server.port设置为8443,这是在开发阶段HTTPS服务器的常用选择。
  • server.ssl.key-store属性应该设置为我们所创建的keystore文件的路径。在这里,它使用了file:// URL,因此会在文件系统中加载,但是,如果你需要将它打包到一个应用JAR文件中,就需要使用“classpath:”URL来引用它。
  • server.ssl.key-store-password和server.ssl.key-password属性都设置成了创建keystore时所设置的密码。

日志配置

默认情况下,Spring Boot通过Logback配置日志,日志会以INFO级别写入到控制台中。为了完全控制日志的配置,我们可以在类路径的根目录下(在src/main/resources中)创建一个logback.xml文件。

如下是一个logback.xml配置的样例,更多的使用方法可以参见:http://logback.qos.ch/manual/configuration.html#autoScan

<configuration>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="debug">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

借助Spring Boot的配置属性功能,我们不用创建logback.xml文件就能完成这些变更。默认情况下,日志文件一旦达到10MB,就会轮换。

logging:
  path: /var/logs/
  file: LOG.log
  level:
    tacos: WARN
    org:
      springframework:
        security: DEBUG

在设置属性的时候,我们并非必须要将它们的值设置为硬编码的String或数值。其实,我们还可以从其他的配置属性派生值。 例如,假设(不管基于什么原因)我们想要设置一个名为greeting.welcome的属性,它的值来源于名为spring.application.name的另一个属性。为了实现该功能,在设置greeting.welcome的时候,我们可以使用${}占位符标记。

greeting:
  welcome: ${spring.application.name}

为了支持配置属性的注入,Spring Boot提供了@ConfigurationProperties注解。将它放到Spring bean上之后,它就会为该bean中那些能够根据Spring环境注入值的属性赋值。@ConfigurationProperties通常会放到一种特定类型的bean中,这种bean的目的就是持有配置数据。

配置属性的元数据完全是可选的,它并不会妨碍配置属性的运行。但是,元数据对于为配置属性提供一个最小化的文档非常有用。为了创建自定义配置属性的元数据,我们需要在META-INF下创建一个名为additional-spring-configuration-metadata.json的文件。

Spring profile。profile是一种条件化的配置,在运行时,根据哪些profile处于激活状态,可以使用或忽略不同的bean、配置类和配置属性。定义特定profile相关的属性的一种方式就是创建另外一个YAML或属性文件,其中只包含用于生产环境的属性。文件的名称要遵守如下的约定:application-{profile名}.yml或 application-{profile名}.properties。通过创建模式为application-{profile名}.yml或application-{profile名}.properties的YAML或属性文件,我们可以按需定义任意数量的profile。或者,我们也可以在application.yml中再输入3个中划线,结合spring.profiles属性来指定其他名称的profile,然后添加该profile特定的相关属性。

如何激活一个profile呢?

要激活某个profile,需要做的就是将profile名称的列表赋值给spring.profiles.active属性。例如,在application.yml中,我们可以如下方式设置,spring.profiles.active属性名是复数形式的profile。这意味着我们可以设置多个激活的profile。 

spring: 
    profiles: 
        active: -prod

如果我们将Spring应用部署到Cloud Foundry中,将会自动激活一个名为cloud的profile。如果你的生产环境是Cloud Foundry,那么你可以将生产环境相关的属性放到cloud profile下。有时候,为不同的profile创建一组独特的bean是非常有用的。正常情况下,不管哪个profile处于激活状态,Java配置类中声明的所有bean都会被创建。但是,假设我们希望某些bean仅在特定profile激活的情况下才需要创建。在这种情况下,@Profile注解可以将某些bean设置为仅适用于给定的profile。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值