1.配置文件
SpringBoot使用一个全局配置文件,配置文件名是固定的:
- application.properties
- application.yml
配置文件作用:修改SpringBoot自动配置的默认值;
YAML(YAML Ain’t Markup Language):YAML不是一种标记语言
标记语言:
以前是xml
现在是yaml,以数据为中心,比json、xml更适合做配置文件;
server:
port: 8081
XML
<server>
<port>8081</port>
</server>
2.YAML语法
a.基本语法
k: v:表示一对键值对(空格必须有);
以空格的缩进表示层级关系,只要是左对齐,都为同一层的;
server:
port: 8010
path: /hello
b.值的写法
字面量:数字、字符串、布尔----直接来写,字符串不用加引号
“”:双引号,不会转义字符串里面的特殊字符,特殊字符作为本身的意思输出;
name:“zhansan \n lisi” 输出:zhangsan 换行 lisi
‘’:单引号,会转义特殊字符,最终转为一个普通字符串数据
对象、Map:
K: V 在下一行写对象属性和值的关系;注意缩进
friends:
lastname: zhangsan
age: 20
行内写法:
friends: {lastname: zhangsan,age: 20}
数组(list、set)
用- 值表示数组中一个元素
pets:
- cat
- dog
行内写法:
pets: [cat,dog]
3.配置文件注入
yaml配置文件
person:
lastname: zhangsan
lists:
- cat
- dog
a.ConfigurationProperties
javaBean
/** * @author DaXia_Hao * @date 2019/7/18 0018 9:41 * 将配置文件中属性映射到这个组件中 * @ConfigurationProperties * (prefix = "person")配置文件中哪个下面的所有属性进行映射 * * 只有这个组件是容器的组件,才能容器提供@ConfigurationProperties功能 **/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastname;
private List<Object> lists;
导入配置文件处理器,可以提升输入配置文件
<!--导入配置文件处理器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
b.value
public class Person {
@Value("${person.last-name}")
private String lastname;
@Value("#{11*2}")
private Integer age;
@value获取值和@ConfigurationProperties获取值比较
@ConfigurationProperties | @value | |
---|---|---|
功能 | 批量注入配置文件中属性 | 一个个指定 |
松散绑定(大小写) | 支持last_name --> lastName | 不支持 |
SpEL | 不支持 | 支持@Value("#{11*2}") |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
如果我们只是在某个业务逻辑获取配置文件中某个值,一般用@value!!
JSR303数据校验
@Validated
public class Person {
@Email
private String lastname;
c.PropertySource
@PropertySource(value = {“classpath:person.properties”}) 加载指定配置文件;
d.ImportResource
目的:导入Spring的配置文件,让配置文件里面的内容生效;
Spring Boot里面没有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="club.eryastudio.springboot02config.service.helloService">
</bean>
</beans>
若想生效,@ImportResource(locations = {“classpath:bean.xml”})标注在一个配置类上;
@ImportResource(locations = {"classpath:bean1.xml"})
@SpringBootApplication
public class SpringBoot02ConfigApplication {
Spring Boot推荐方式
1.配置类
2.@Bean
/** @Configuration 指明当前类是一个配置类,用来代替spring的配置文件bean.xml 在配置文件汇总用<bean></bean>标签添加组件**/
@Configuration
public class MyAppConfig {
//将方法的返回值添加到容器中:容器中这个组件的默认id就是方法名
@Bean
public helloService hello(){
return new helloService();
}
}
4.配置文件占位符
1.随机数
${random.value} ${random.int}
2.占位符获取之前配置的值,如果没有可以是用:指定占位符
person.dog.name = ${person.hello:hello}_dog
5.Profile
1.多profile文件
提供多环境支持,可以通过激活指定参数等方式, 快速切换环境;
文件名是 application-{profile}.properties/yml
#默认使用application.properties
#application-dev.properties
spring.profiles.active=dev
2.yml支持多文档块方式
省去写多个文档!
server:
port: 8081
spring:
profiles:
active: dev
---
server:
port: 8083
spring:
profiles: dev
---
server:
port: 8084
spring:
profiles: prod
3.激活指定profile
a.在配置文件中指定spring.profiles.active=dev
b.命令行激活 --spring.profiles.active=dev
6.配置文件加载位置
application.yml作为默认boot配置文件,按照优先级从高到低排序,所有位置文件都会被加载,高优先级覆盖低优先级;
-
file:./config/
-
file:./
-
classpath:/config/
-
classpath:/
spring.context-path=/boot #配置项目访问路径
spring.config.location= D:/application.yml #指定配置文件位置,项目已经打包好,使用命令行参数指定配置参数
7.自动配置原理
配置文件能写什么?怎么写?自动配置原理;
1.自动配置原理:
a.SpringBoot启动加载主配置类,开启了自动配置功能**@EnableAutoConfiguration**
b.@EnableAutoConfiguration作用:
-
利用EnableAutoConfigurationImportSelector给容器导入一些组件?
-
可以插入selectImports()方法的内容;
-
List configurations = getCandidateConfigurations(annotationMetadata, attributes);获取候选配置;
SpringFactoriesLoader.loadFactoryNames() 扫描所有jar包类路径下 META-INF/spring.factories 把扫描到这些文件内容包装成properties对象 从properties中获取到EnableAutoConfiguration.class类对应的值,然后把他们添加在容器中
将类路径下META-INF/spring.factories 配置的所有EnableAutoConfiguration值添加到容器中;
# Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\ org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\ org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\ org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\ org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\ org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\ org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\ org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\ org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\ org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\ org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\ org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration,\ org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.ldap.LdapDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\ org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\ org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\ org.springframework.boot.autoconfigure.elasticsearch.jest.JestAutoConfiguration,\ org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\ org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\ org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\ org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\ org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\ org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\ org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\ org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\ org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\ org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\ org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\ org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\ org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\ org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\ org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\ org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\ org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\ org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\ org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\ org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,\ org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,\ org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\ org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\ org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\ org.springframework.boot.autoconfigure.mobile.DeviceResolverAutoConfiguration,\ org.springframework.boot.autoconfigure.mobile.DeviceDelegatingViewResolverAutoConfiguration,\ org.springframework.boot.autoconfigure.mobile.SitePreferenceAutoConfiguration,\ org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\ org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\ org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\ org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\ org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration,\ org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration,\ org.springframework.boot.autoconfigure.security.SecurityFilterAutoConfiguration,\ org.springframework.boot.autoconfigure.security.FallbackWebSecurityAutoConfiguration,\ org.springframework.boot.autoconfigure.security.oauth2.OAuth2AutoConfiguration,\ org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\ org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\ org.springframework.boot.autoconfigure.social.SocialWebAutoConfiguration,\ org.springframework.boot.autoconfigure.social.FacebookAutoConfiguration,\ org.springframework.boot.autoconfigure.social.LinkedInAutoConfiguration,\ org.springframework.boot.autoconfigure.social.TwitterAutoConfiguration,\ org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\ org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\ org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\ org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\ org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,\ org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration,\ org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration,\ org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration,\ org.springframework.boot.autoconfigure.web.HttpEncodingAutoConfiguration,\ org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration,\ org.springframework.boot.autoconfigure.web.MultipartAutoConfiguration,\ org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration,\ org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration,\ org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration,\ org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration,\ org.springframework.boot.autoconfigure.websocket.WebSocketMessagingAutoConfiguration,\ org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration
每一个这样的 xxxAutoConfiguration类都是容器中一个组件,都加入到容器中,用他们来做自动配置;
c.每一个自动配置类进行自动配置功能
d.以HttpEncodingAutoConfiguration为例解释自动配置原理
@Configuration //表示这是一个配置类,以前编写的配置文件一样,也可以给容器中添加组件 @EnableConfigurationProperties({HttpEncodingProperties.class}) //启动指定类的ConfigurationProperties功能,并把这个类加入到ioc容器中 @ConditionalOnWebApplication //spring底层@Conditional注解,根据不同的条件,如果满足指定条件,整个配置类里面的配置就会生效; //判断当前应用是否为web,如果是,配置生效; @ConditionalOnClass({CharacterEncodingFilter.class})//判断是否有没有这个类,springmvc解决乱码过滤器; @ConditionalOnProperty( prefix = "spring.http.encoding", value = {"enabled"}, matchIfMissing = true ) //判断配置文件中是否存在某个配置 spring.http.encoding,如果不存在,判断也是成立的 public class HttpEncodingAutoConfiguration { //他已经和springboot配置文件映射了 private final HttpEncodingProperties properties; @Bean //给容器中添加组件,这个组件的某些值需要从properties中获取 @ConditionalOnMissingBean({CharacterEncodingFilter.class}) //判断容器中必须没有这个组件 public CharacterEncodingFilter characterEncodingFilter() { CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter(); filter.setEncoding(this.properties.getCharset().name()); filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST)); filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE)); return filter; } 根据当前不同的条件判断这个配置类是否生效? 一但这个配置类生效,这个配置类就会给容器中添加各种组件,这些组件的属性就是从对应properties中获取的,这些类中每一个属性又是和配置文件绑定; public class HttpEncodingProperties { public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); private Charset charset = DEFAULT_CHARSET; private Boolean force;
e.所有在配置文件中能配置的属性都是在xxxProperties类中封装;配置文件能配置什么就可以参照某个功能对应的这个属性类;
@ConfigurationProperties(prefix = "spring.http.encoding")//从配置文件中获取指定的值与本案进行绑定
public class HttpEncodingProperties {
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
精髓:
1.springboot启动会加载大量的自动配置类
2.我们看需要的功能是否默认自动配置
3.我们看自动配置类到底配置了那些组件
4.给容器中自动配置类添加组件的时候,会从properties中获取某些属性,我们就会从配置文件中指定这些属性的值;
xxxAutoConfiguartion:自动配置类
给容器中添加组件
xxxProperties:封装配置文件
2.细节
@conditional
作用:必须是@conditional指定的条件成立,才给容器中添加组件,配置里面的内容才能生效;
@ConditionalOnMissingBean({CharacterEncodingFilter.class})//判断容器中必须没有这个组件
自动配置类必须在一定条件下才能生效
我们可以通过启动 debug=true 属性,来让控制台打印生效的自动配置类;
=========================
AUTO-CONFIGURATION REPORT
=========================
Positive matches://启动的配置
-----------------
DispatcherServletAutoConfiguration matched:
- @ConditionalOnClass found required class 'org.springframework.web.servlet.DispatcherServlet'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)
- @ConditionalOnWebApplication (required) found 'session' scope (OnWebApplicationCondition)