开发环境:
person: lastNAME: carson age: 18 boss: true birth: 1234/12/12 #map写法: {k: v,k2: v2} maps: {k1: v1,k2: v2} #数组写法: -值 lists: - lisi - zhangsan - wangwu - zhaoliu dog: name: 小狗 age: 3 spring: mvc: view: prefix: /WEB-INF/views/ suffix: .jsp datasource: url: jdbc:mysql:///ssm username: root password: root driver-class-name: com.mysql.jdbc.Driver jpa: hibernate: ddl-auto: update server: port: 9090 复制代码
@ConfigurationProperties | @Value | |
---|---|---|
批量注入配置文件中的属性 | 功能 | 一个个指定 |
支持 | 松散绑定(松散语法)大小写 | 不支持 |
不支持 | SpEL表达式 | 支持 |
支持 | JSR303数据校验 | 不支持 |
支持 | 复杂类型封装 | 不支持 |
这两种方式都能获取值:
@Validated
@Value
@Getter@Setter @ToString @Component //@ConfigurationProperties (prefix = "person") @Validated // 来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。 public class Person { // @Email @Value("${person.lastNAME}") private String lastNAME; @Value("#{3*3}") private Integer age; private Boolean boss; private Date birth; private Map<String,Object> maps; private List<Object> lists; private Dog dog; } 复制代码
因为 @ConfigurationProperties 是全局注解,如果想指定的话
@ImportResource: 导入Spring配置文件,让配置文件里面的内容生效
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="helloService" class="com.carson.springboot.service.impl.HelloService"></bean> </beans> 复制代码
@Autowired ApplicationContext ioc; @Test public void testHelloService(){ // 是否是包含 这个 bean boolean b = ioc.containsBean("helloService"); System.out.println(b);//false } 复制代码
false 说明Spring Boot 里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别
如果想让Spring的配置文件生效,加载进来; 就 把@ImportResource 标注在一个配置类上
@ImportResource(locations = {"classpath:beans.xml"}) @SpringBootApplication public class SpringbootApplication { public static void main(String[] args) { SpringApplication.run(SpringbootApplication.class, args); } } 复制代码
@Autowired ApplicationContext ioc; @Test public void testHelloService(){ // 是否是包含 这个 bean boolean b = ioc.containsBean("helloService"); System.out.println(b);//true } 复制代码
SpringBoot推荐给容器中添加组件的方式:
使用 @Bean
/** * @Configuration: 指明当前类是一个配置类;就是来代替之前的Spring配置文件 * * 以前配置文件总 用 <bean></bean> 标签添加组件 */ @Configuration public class MyAppConfig { // 将方法的返回值添加到容器中,容器中这几个组件默认的id就是方法名 @Bean public HelloService helloService(){ return new HelloService(); } } 复制代码
记得把之前主类的@ImportResource注解 去掉!
输出结果: . ____ _ __ _ _ /// / ___'_ __ _ _(_)_ __ __ _ / / / / ( ( )/___ | '_ | '_| | '_ // _` | / / / / /// ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_/__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.1.5.RELEASE) 2019-06-29 16:53:48.081 INFO 11084 --- [ main] c.c.s.SpringbootApplicationTests : Starting SpringbootApplicationTests on DESKTOP-JBSD6AK with PID 11084 (started by My in F:/code/springboot) 2019-06-29 16:53:48.083 INFO 11084 --- [ main] c.c.s.SpringbootApplicationTests : No active profile set, falling back to default profiles: default 2019-06-29 16:53:52.689 INFO 11084 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' 2019-06-29 16:53:53.988 INFO 11084 --- [ main] c.c.s.SpringbootApplicationTests : Started SpringbootApplicationTests in 7.259 seconds (JVM running for 10.759) true 2019-06-29 16:53:54.433 INFO 11084 --- [ Thread-3] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' 复制代码
也是 true
${random.value} ${random.int} ${random.long} ${random.int(10)} ${random.int[1024,65536]} 复制代码
person: lastNAME: bob${random.uuid} age: ${random.int} boss: true birth: 1234/12/12 maps: {k1: v1,k2: v2} lists: - lisi - zhangsan - wangwu - zhaoliu dog: name: ${person.lastNAME}_dog age: 3 复制代码
如果
dog: name: ${person.lastNAME}_dog 复制代码
如果lastNAME没有的话, 那就
dog: name: ${person.lastNAME:hello}_dog 复制代码
比如我配置3个端口,一个默认的,一个dev(开发),一个prod(测试)
主配置文件名可以是 application.yml/application.properties
默认使用application.yml的配置;
以 --- 分隔 文档快
spring: profiles: active: dev server: port: 9090 --- server: port: 9091 spring: profiles: dev --- server: port: 9092 spring: profiles: prod 复制代码
1, 在配置文件中指定 spring.profiles.active=dev
2, 命令行:
idea功能栏中的 run > edit > program arguments 添加上
--spring.profiles.active=prod
--spring.profiles.active=dev
3,cmd中 将 项目打成 jar包
java -jar (jar包名) --spring.profiles.active=prod
4, 虚拟机 参数:
idea功能栏中的 run > edit >VM options 添加上
-Dspring.profiles.active=prod/dev
Spring Boot 启动会扫描以下位置的application.yml或application.properties文件作为默认配置文件
以上是按照优先级从高到低的顺序,所有的配置文件都会被加载, 高优先级配置 会覆盖 低优先级配置
file : 跟src平级的目录
classpath: resources目录下的
1.将项目打包
2.命令行格式: java -jar 包名 --spring.config.location= F:/app/application.properties(配置文件绝对路径)
项目打包之后可能后来会需要修改一些配置,就可以使用这种方式,并且旧配置还会存在,新配置也会应用上
SpringBoot也可以从以下位置加载配置,优先级从高到低,高优先级覆盖低优先级,如果有不同的配置, 就会形成互补
命令行参数
java -jar xxx.jar --server.port=8081 --xxx
多个配置用空格分开: --xxx --xxx
来自java:comp/env的NDI属性
Java系统属性(System.getProperties())
操作系统环境变量
RandomValuePropertySource配置的random.*属性值
由jar包外向jar包内进行寻找:
还有其他的:
详情参考官网文档的第 24章
自动配置到底能些什么?怎么写?自动配置原理:
文档地址
查看目录最后一章 X. Appendices
这里面说明了都有哪些配置项
其实:
xxxxAutoConfigurartion: 自动配置类;
给容器中添加组件
xxxxProperties:封装配置文件中相关属性;
技巧:
idea双击Shift,搜索 *AutoConfiguration
点开缓存相关的自动配置
我们将会看到以下源码:
@EnableConfigurationProperties({CacheProperties.class}) @AutoConfigureAfter({CouchbaseAutoConfiguration.class, HazelcastAutoConfiguration.class, HibernateJpaAutoConfiguration.class, RedisAutoConfiguration.class}) @Import({CacheAutoConfiguration.CacheConfigurationImportSelector.class}) public class CacheAutoConfiguration { public CacheAutoConfiguration() { } 复制代码
ctrl+鼠标左键点击:
@EnableConfigurationProperties({CacheProperties.class}) //点击 CacheProperties 复制代码
我们会看到在CacheProperties类上:
@ConfigurationProperties( prefix = "spring.cache" ) public class CacheProperties { 复制代码
prefix = "spring.cache" : 就是在yml/properties配置文件的语法前缀
至于能配置哪些具体东西?
就是这些
或者你可以利用idea的代码提示在配置文件里,比如我调用 第一个getType
这就是通过源码的方式,来了解到我们可以在配置文件里配置什么东西
比如我想连接数据库,我来搜索一下
我看到了我们的需要的字段,以及下面很多的方法(这里就不截图了)
接下来就是到配置文件配置了:
我发现源码中有很多的 @ConditionalOn***
它其实就是利用Spring底层的 @Conditional注解
作用: 必须是 @Conditional 指定的条件成立,才给容器中添加组件,配置类里面的内容才会生效,如果返回false那么,你配的东西都不会生效的
SpringBoot 扩展了 @Conditional注解 比如:
所以其实自动配置类必须在一定的条件下才能生效
我们该怎么知道哪些类生效哪些没生效呢?很简单,在配置文件里添加:
debug: true 复制代码
然后运行我们的朱类:
我们会看到:
还有:
都会在控制台打印输出