SpringBoot解决⽅案-配置
习惯优于配置
Spring Boot 项⽬的重要思想就是“习惯优于配置”,这也是为什么该项⽬诞⽣的原因,让开发者免于 Spring ⽣态中各种项⽬的配置。尽管如此,但项⽬中完全零配置还是很难做到的,因此本篇⽂章就来讲解⼀下 Spring Boot 中的配置。
分析默认项⽬
先从默认创建的项⽬开始分析,Spring Boot 默认创建的项⽬会有⼀个如下所⽰的⼊⼝类,该类被标注了@SpringBootApplication注解,⽽该注解相当于@SpringConfiguration、@EnableAutoConfiguration和@ComponentScan三个的结合,由于前两个注解才和配置有关,所以下⾯只讲解前两个。
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@EnableAutoConfiguration
若标记了@EnableAutoConfiguration注解, Spring Boot 会根据 ClassPath 中的 Jar 包依赖来⾃动配置程序,例如添加了 Web 相关的依赖则会⾃动进⾏ Web 配置,且注意官⽅建议将该注解标记且只标记⼀次在标有@Configuration的类上。
由于⾃动配置是⾮侵⼊性的,因此可以⾃定义配置来覆盖原有的⾃动配置,⽽且还可以禁⽌某些⾃动配置类,例如下⾯例⼦禁⽌了数据源的⾃动配置。
@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class DemoConf {
// ...
}
@SpringConfiguration
由源码可知@SpringConfiguration是@Configuration的别名,⽽被@Configuration标注的类,相当于⼀个配置⽂件可进⾏各种⾃定义配置,例如下⾯配置类中注册了⼀个 Bean 。
@Configuration
public class AppConf {
@Bean
public DemoBean demoBean() {
return new DemoBean();
}
}
属性⽂件及其优先级
标注@Configuration的配置类描述了如何进⾏配置类似于函数,⽽属性⽂件的属性则相当于参数。
默认情况下配置类会按如下列表从⾼到低的优先级读取属性⽂件,且默认读取⽂件名为application.suffix的属性⽂件,其中的suffix为properties 或yml其中之⼀,分别代表⽀持的两种类型⽂件。
相对打包后程序⽬录./config下
打包后程序⽬录下
相对项⽬资源⽬录./config下
项⽬资源⽬录下
注意优先级⾼的属性⽂件中的相同属性,会覆盖掉优先级低的⽂件中的属性配置,例如项⽬资源⽬录下有如下⽂件结构,根据上述规则最终获取到的demo.name的值就为foo。这样的设计可以⽅便利⽤外部属性⽂件改变程序某些配置属性,例如改变绑定端⼝或者数据库地址。
/resources
|- /config
|- application.properties <- demo.name=foo
|- application.properties <- demo.name=bar
运⾏时指定属性
spring怎么读取properties除了可⽤外部属性⽂件覆盖内部属性⽂件的属性,还可以在运⾏程序时指定属性,例如下⾯命令指定了demo.name属性值为foo。
java -jar demo.jar --demo.name=foo
当然若是不想运⾏时指定属性,也可使⽤SpringApplication.setAddCommandLineProperties(false)来禁⽌读取命令⾏的属性。
指定属性⽂件
可利⽤@PropertySource来指定属性⽂件,例如下⾯的例⼦,但注意只⽀持properties和XML两种类型的属性⽂件。
@Configuration
@PropertySource("classpath:/demo.properties") // or @PropertySource("file:/l")
public class AppConf {
// ...
}
虽然不⽀持YAML等其他类型的⽂件,但可以⾃⼰实现PropertySourceFactory接⼝(该特性在 Spring 4.3 中引⼊),然后如下⾯的例⼦在注解中⽤factory指定实现类,具体实现参考这篇。
@Configuration
@PropertySource(value="classpath:/l", factory=YamlPropertySourceFactory.class)
public class AppConf {
// ...
}
多环境的属性⽂件
对于不同环境,只需要创建名为application-env.sufix的属性⽂件,其中env和suffix分别为环境名和后缀名,然后在默认的属性⽂件application.suffix中配置属性spring.profiles.active=env即可。
例如创建如下的⽂件⽬录结构,然后在application.properties⽂件中配置属性spring.profiles.active=dev,就可以加载名为application-dev.properties的属性⽂件。
/resources
|- application.properties
|- application-dev.properties
|- application-prod.properties
使⽤属性
使⽤@Value加 EL 表达式就可以获取属性⽂件中的属性,例如下⾯⼀个简单的例⼦。
/* application.properties 's content */
// demo.name=foo
@Configuration
public class AppConf {
@Value("${demo.name}")
private String name;
}
@Value注解不⽀持批量导⼊属性,但使⽤@ConfigurationProperties就可以批量导⼊属性,例如下⾯的例⼦。
/* application.properties 's content */
// demo.name=foo
// demo.addr=bar
@Configuration(prefix = "demo") // same as @Configuration("demo")
public class AppConf {
private String name;
private String addr;
// getters and setters
}
除了能批量导⼊之外,其与@Value还有其他区别,具体参考这篇。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论