内容简介:开发环境:这两种方式都能获取值:@Validated
开发环境:
- win10
- jdk1.8
- idea2019
- maven 3.2.5
- Spring Boot v2.1.5.RELEASE (版本)
1. yml文件的语法概览:
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 复制代码
2. @Value获取值和 @ConfigurationProperties获取值比较
@ConfigurationProperties | @Value | |
---|---|---|
批量注入配置文件中的属性 | 功能 | 一个个指定 |
支持 | 松散绑定(松散语法)大小写 | 不支持 |
不支持 | SpEL表达式 | 支持 |
支持 | JSR303数据校验 | 不支持 |
支持 | 复杂类型封装 | 不支持 |
这两种方式都能获取值:
- 如果,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value
- 如果,我们专门编写了一个javaBean来和配置文件进行映射;@ConfigurationProperties
@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; } 复制代码
3. @PropertySource&@ImportResource
因为 @ConfigurationProperties 是全局注解,如果想指定的话
- @PropertySource:可以指定某个文件 @PropertySource("classpath: xxx.properties)
@ImportResource: 导入Spring配置文件,让配置文件里面的内容生效
- 创建一个HelloService 类
- 如果没有注解情况下
<?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
- 1, 配置类======Spring配置文件
- 建一个包 config,专门放配置类:MyAppConfig
/** * @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
4. 配置文件里的 ${}
random随机数
${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 复制代码
5. Profile
5.1 多个Profile 文件
Profile是Spring对不同环境提供不同配置功能的支持,可以通过指定参数等方式快速切换环境
比如我配置3个端口,一个默认的,一个dev(开发),一个prod(测试)
主配置文件名可以是 application.yml/application.properties
默认使用application.yml的配置;
5.2 yml的多文档块
以 --- 分隔 文档快
spring: profiles: active: dev server: port: 9090 --- server: port: 9091 spring: profiles: dev --- server: port: 9092 spring: profiles: prod 复制代码
- active:是指定哪个文档快
- profiles: 指定一个名称,让active识别的
5.3 激活指定profile
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
6.Spring Boot配置文件的加载位置
Spring Boot 启动会扫描以下位置的application.yml或application.properties文件作为默认配置文件
- file: ./config/
- file: ./
- classpath: ./config/
- classpath: /
以上是按照优先级从高到低的顺序,所有的配置文件都会被加载, 高优先级配置 会覆盖 低优先级配置
file : 跟src平级的目录
classpath: resources目录下的
我们也可以通过配置spring.config.location来改变默认配置文件位置:
1.将项目打包
2.命令行格式: java -jar 包名 --spring.config.location= F:/app/application.properties(配置文件绝对路径)
项目打包之后可能后来会需要修改一些配置,就可以使用这种方式,并且旧配置还会存在,新配置也会应用上
7.外部配置加载顺序
SpringBoot也可以从以下位置加载配置,优先级从高到低,高优先级覆盖低优先级,如果有不同的配置, 就会形成互补
-
命令行参数
java -jar xxx.jar --server.port=8081 --xxx
多个配置用空格分开: --xxx --xxx
-
来自java:comp/env的NDI属性
-
Java系统属性(System.getProperties())
-
操作系统环境变量
-
RandomValuePropertySource配置的random.*属性值
由jar包外向jar包内进行寻找:
优先加载带profile的
- jar包"外"部的application-{profile}.properties或application.yml(带spring.profile)的配置文件
- jar包''内''部的application-{profile}.properties或application.yml(带spring.profile)的配置文件
再来加载不带profile的
- jar包''外''部的application.properties或application.yml(不带spring.profile)的配置文件
- jar包''内''部的application.properties或application.yml(不带spring.profile)的配置文件
还有其他的:
- @Configuration注解类上的@PropertySource
- 通过SrpingApplication.setDefaultProperties指定默认属性
8.自动配置原理(重点)
自动配置到底能些什么?怎么写?自动配置原理:
查看目录最后一章 X. Appendices
这里面说明了都有哪些配置项
其实:
- 1.SpringBoot启动会加载大量的自动配置类
- 2.我们看我们需要的功能有没有SpringBoot默认写好的自动配置类
- 3.我们再来看这个自动配置类到底配置了哪些组件(只要我们要用的组件有,我们就不需要再来配置了)
- 4.给容器中自动配置类添加组建的时候,会从properties类中获取某些属性,我们就可以在配置文件中指定这些属性的值
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
这就是通过源码的方式,来了解到我们可以在配置文件里配置什么东西
比如我想连接数据库,我来搜索一下
我看到了我们的需要的字段,以及下面很多的方法(这里就不截图了)
接下来就是到配置文件配置了:
9.细节
@Conditional派生注解
我发现源码中有很多的 @ConditionalOn***
它其实就是利用Spring底层的 @Conditional注解
作用: 必须是 @Conditional 指定的条件成立,才给容器中添加组件,配置类里面的内容才会生效,如果返回false那么,你配的东西都不会生效的
SpringBoot 扩展了 @Conditional注解 比如:
所以其实自动配置类必须在一定的条件下才能生效
我们该怎么知道哪些类生效哪些没生效呢?很简单,在配置文件里添加:
debug: true 复制代码
然后运行我们的朱类:
我们会看到:
还有:
都会在控制台打印输出
以上所述就是小编给大家介绍的《Spring Boot--yml/properties配置文件以及部分源码》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 源码分析(五)—配置篇
- 源码安装配置 Nginx 记录
- Nginx 源码:配置文件解析
- Nacos 源码分析(二):获取配置流程
- mybatis原理,配置介绍及源码分析
- Nginx源码阅读笔记-配置解析流程
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
人机交互:以用户为中心的设计和评估
董建明、傅利民、[美]沙尔文迪 / 清华大学出版社 / 2003-9-1 / 28.00
本书综述部分介绍了与“用户为中心的设计和评估”方法相关的背景知识及发展概况。其后,分3篇分别介绍了解用户、用户界在设计和可用性评估的内容及一些相关的研究专题。最后,第11章讨论了在组织中实施以用户为中心的设计的专题。本书主要面向的读者包括:软件或网站的设计人员。同时本书也可成为“现代人因工程学”及“以用户为中心的设计”的教材,还可作为软件或网站公司经理的提高用户满意度或提升公司形象的手册。一起来看看 《人机交互:以用户为中心的设计和评估》 这本书的介绍吧!