4.Spring Boot配置

阅读: 评论:0

4.Spring Boot配置

4.Spring Boot配置

4.Spring Boot配置

文章目录

        • 4.Spring Boot配置
          • 1.配置文件
            • 1.1 YAML 语法:
            • 1.2值的写法
            • 1.3数组(List,Set):
            • 1.4.properties 中文全部是乱码是什么原因造成的呢?
            • 1.5 @Value和@ConfigurationProperties区别
            • 1.6配置文件占位符
            • 1.7Profile
          • 2.加载顺序
            • 1)配置文件加载的位置:
            • 2)外部配置加载顺序:
          • 3.配置原理
            • 1.自动配置原理
          • 4.注解细节解释

1.配置文件
  • Spring boot 全局配置文件是:application.properties或l

作用:修改SpringBoot自动配置的默认值;

YAML(YAML Ain’t Markup Language)

​ YAML A Markup Language:是一个标记语言

​ YAML isn’t Markup Language:不是一个标记语言;

标记语言:

​ 以前的配置文件;大多都使用的是 文件;

​ YAML:以数据为中心,比json、xml等更适合做配置文件;

1.1 YAML 语法:
  • key冒号空格value(key: value):表示一个键值对。

  • 空格的缩进来控制层级关系(空格数没限制):只要左侧对齐的一列数据,都是同一个层级的值。

  • 属性和值区分大小写;

1.2值的写法
  • 普通值的写法(数字,字符串,布尔): key: value (正常的key-value形式)
    字符串默认不用加上单引号或双引号;
    双引号:不会转义字符串里面的特殊字符,特殊字符会作为本身想表示的意思。例如 name: “wang n hao” 输出wang 换行 hao;
    单引号:会转义特殊字符,特殊字符最终只是一个普通字符串数据,例如 name: ‘wang n hao’ 输出 wang n hao

  • 对象、Map 的写法:key: 在下一行直接写对象的属性值(是key: value的形式),注意缩进

    people: name: wanghaoage: 30
    

    在一行的写法:和JSON的数据格式很想

    people: {name: wanghao,age: 30}
    
1.3数组(List,Set):

用- 值表示数组中的一个元素;

peoples: - people1- people2

行内写法:

peoples: [people1,people2]

上面这么多理论了,下面用理论指导下实践吧:
配置文件编写如下:

people:name: xiaowangage: 30isboss: falsebirth: 2018/03/27maps: {k1: v1,k2: v2}list:- l1- l2

javaBean: 省略getter和setter方法

/*** @ConfigurationProperties :将类中所有属性和配置文件中的属性进行绑定(默认从全局配置文件中获取)*    prefix :配置文件中那个下面的所有属性进行映射*  @Component:将类作为SpringBoot的组件*  只有容器中的组件才能提供  @ConfigurationProperties 功能*/
@Component
@ConfigurationProperties(prefix = "people")
public class People {private String name;private Integer age;private boolean isboss;private Date birth;private Map maps;private List list;
}

运行输出的对象结果为:

People{name=‘xiaowang’, age=30, isboss=false, birth=Tue Mar 27 00:00:00 CST 2018, maps={k1=v1, k2=v2}, list=[l1, l2]}

properties 文件怎么配置呢?

people.name=张
people.age=30
people.isboss=false
people.birth=2018/03/27
people.maps.k1=v1
people.maps.k2=测试
people.list=a,b,c

现在执行运行结果为:

People{name='å¼ ', age=30, isboss=false, birth=Tue Mar 27 00:00:00 CST 2018, maps={k1=v1, k2=测试}, list=[a, b, c]}

1.4.properties 中文全部是乱码是什么原因造成的呢?

原因: IDEA 中默认的编码方式是utf-8,但是之前我们用的properties 是ascii 编码,所以需要去Settings 修改 File Encodings 如下提示的地方,注意改过之后项目要重新Build,下图有英文提醒。

1.5 @Value和@ConfigurationProperties区别
@ConfigurationProperties@Value
功能批量注入配置文件中的属性单个指定
松散绑定(松散语法)(属性的大写字母和中横线是等价的)支持不支持
SpEL不支持支持
JSR303数据校验 (属性支持JSR303注解校验)支持不支持
复杂类型封装支持不支持

如果是批量注入就用@ConfigurationProperties,如果某个业务中使用配置文件中的某个值就用@Value。·

SpEL(Spring Expression Language):即Spring表达式语言,是比JSP的EL更强大的一种表达式语言,@Value ("#{表达式}")时可以使用,例如@Value ("#{12*3}") 表达式可以有很多种(字符串连接,算数运算,比较运算,条件运算,正则表达等等);

1.6配置文件占位符
  • 配置文件中可以使用随机数: 随机字符串 ${random.value},随机int ${random.int},随机long ${random.long},随机10以内的随机数 ${random.int(10)},10到20的随机数 ${random.int[10,20]}。

  • 属性配置占位符:

    1)可以在配置文件中引用前面配置过的属性;

    2)${people.name:默认值} 来指定找到不到属性时的默认值;

1.7Profile

​ profile 是Spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境

​ 1)多profile文件形式:application-{profile}.properties/yml

​ 2)yml 支持多文档快方式:在一个文档中以— 作为文档快的分块标识 (spring:profiles:dev 作为分块环境),如下

server:port: 8081
spring:profiles:active: dev---
server:port: 8082
spring:profiles: dev

​ 3)激活指定profile : 图中与命令行和虚拟机参数配置的地方
​ 1.在配置文件中指定:spring.profiles.active=dev
​ 2.命令行 :
​ java -jar spring-boot.jar --spring.profiles.active=dev;
​ 可以直接在测试的时候,配置传入命令行参数

​ 3.虚拟机参数:-Dspring.profiles.active=dev

2.加载顺序
1)配置文件加载的位置:

​ Spring boot 启动会扫描一下位置的application.properties或者l文件为Spring boot的默认配置文件

  • file:./config/ 当前项目下的config 文件夹下(就是和src平级的目录)

  • file:./ 当前项目文件夹下(直接在项目下)

  • classpath:/config/ 类路径的config下 (在项目的 resource 的 config 下)

  • classpath:/ 类路径下 (在项目的 resource 下)

    以上按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置内容,多个位置的配置文件形成互补配置

    可以通过配置fig.location 来改变配置路径(在配置文件中修改或者是命令行的方式)。

2)外部配置加载顺序:

​ 1.命令行参数:所有的配置都可以在命令行上进行指定 java -jar spring-boot.jar --server.port=8081 --t-path=/hello
​ 多个配置用空格分开;格式为 --配置项=值

​ 2.java:comp/env的JNDI属性:是一个J2EE环境的定义

​ 3.Java系统属性&#Properties()):就是系统环境的一些信息

​ 4.操作系统环境变量

​ 5.RandomValuePropertySource配置的random.*属性值

配置加载顺序是:由包外向包内寻找,优先加载带profile的文件。

​ 6.jar包外部的application-{profile}.properties或l(带spring.profile)配置文件

​ 7.jar包内部的application-{profile}.properties或l(带spring.profile)配置文件

​ 8.jar包外部的application.properties或l(不带spring.profile)配置文件

​ 9.jar包内部的application.properties或l(不带spring.profile)配置文件

​ 10.@Configuration注解类上的@PropertySource

​ 11.通过SpringApplication.setDefaultProperties指定的默认属性

官方参考文档

3.配置原理

​ 配置文件可以配置那些配置,如官网参考配置(下面地址)

官方参数配置参考

1.自动配置原理

​ 1)SpringBoot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration。

​ 2)@EnableAutoConfiguration 作用:
​ 利用EnableAutoConfigurationImportSelector给容器中导入一些组件。
​ 可以导入selectImports()方法的内容;
​ List configuration = getCandidateConfigurations(annotationMetadata,attributes)获取候选的配置。

SpringFactoriesLoader.loadFactoryName()
//扫描所有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.t.ConfigurationPropertiesAutoConfiguration,
org.springframework.t.LifecycleAutoConfiguration,
org.springframework.t.MessageSourceAutoConfiguration,
org.springframework.t.PropertyPlaceholderAutoConfiguration,
org.springframework.uchbase.CouchbaseAutoConfiguration,
org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,
org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,
org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveDataAutoConfiguration,
org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration,
org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,
org.springframework.boot.uchbase.CouchbaseDataAutoConfiguration,
org.springframework.boot.uchbase.CouchbaseReactiveDataAutoConfiguration,
org.springframework.boot.uchbase.CouchbaseReactiveRepositoriesAutoConfiguration,
org.springframework.boot.uchbase.CouchbaseRepositoriesAutoConfiguration,
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,
org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration,
org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRestClientAutoConfiguration,
org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration,
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,
org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,
org.springframework.boot.MongoDataAutoConfiguration,
org.springframework.boot.MongoReactiveDataAutoConfiguration,
org.springframework.boot.MongoReactiveRepositoriesAutoConfiguration,
org.springframework.boot.MongoRepositoriesAutoConfiguration,
org.springframework.boot.4j.Neo4jDataAutoConfiguration,
org.springframework.boot.4j.Neo4jReactiveDataAutoConfiguration,
org.springframework.boot.4j.Neo4jReactiveRepositoriesAutoConfiguration,
org.springframework.boot.4j.Neo4jRepositoriesAutoConfiguration,
org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration,
org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration,
org.springframework.boot.dis.RedisAutoConfiguration,
org.springframework.boot.dis.RedisReactiveAutoConfiguration,
org.springframework.boot.dis.RedisRepositoriesAutoConfiguration,
org.springframework.boot.st.RepositoryRestMvcAutoConfiguration,
org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,
org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration,
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,
org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,
org.springframework.vy.template.GroovyTemplateAutoConfiguration,
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.http.HttpMessageConvertersAutoConfiguration,
org.springframework.boot.dec.CodecsAutoConfiguration,
org.springframework.boot.autoconfigure.influx.InfluxDbAutoConfiguration,
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.jersey.JerseyAutoConfiguration,
org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,
org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration,
org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,
org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration,
org.springframework.boot.bedded.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.embedded.EmbeddedMongoAutoConfiguration,
org.springframework.MongoAutoConfiguration,
org.springframework.MongoReactiveAutoConfiguration,
org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,
org.springframework.4j.Neo4jAutoConfiguration,
org.springframework.boot.autoconfigurety.NettyAutoConfiguration,
org.springframework.jpa.HibernateJpaAutoConfiguration,
org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration,
org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration,
org.springframework.boot.autoconfigure.r2dbc.R2dbcTransactionManagerAutoConfiguration,
org.springframework.boot.autoconfigure.rsocket.RSocketMessagingAutoConfiguration,
org.springframework.boot.autoconfigure.rsocket.RSocketRequesterAutoConfiguration,
org.springframework.boot.autoconfigure.rsocket.RSocketServerAutoConfiguration,
org.springframework.boot.autoconfigure.rsocket.RSocketStrategiesAutoConfiguration,
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,
org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration,
org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration,
org.springframework.boot.active.ReactiveSecurityAutoConfiguration,
org.springframework.boot.active.ReactiveUserDetailsServiceAutoConfiguration,
org.springframework.boot.autoconfigure.security.rsocket.RSocketSecurityAutoConfiguration,
org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyAutoConfiguration,
org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,
org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,
org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration,
org.springframework.boot.autoconfigure.security.active.ReactiveOAuth2ClientAutoConfiguration,
org.springframework.boot.autoconfigure.source.servlet.OAuth2ResourceServerAutoConfiguration,
org.springframework.boot.autoconfigure.active.ReactiveOAuth2ResourceServerAutoConfiguration,
org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,
org.springframework.boot.autoconfigure.sql.init.SqlInitializationAutoConfiguration,
org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration,
org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration,
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,
org.springframework.ansaction.TransactionAutoConfiguration,
org.springframework.ansaction.jta.JtaAutoConfiguration,
org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,
org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration,
org.springframework.boot.bedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration,
org.springframework.boot.active.HttpHandlerAutoConfiguration,
org.springframework.boot.active.ReactiveWebServerFactoryAutoConfiguration,
org.springframework.boot.active.WebFluxAutoConfiguration,
org.springframework.boot.ErrorWebFluxAutoConfiguration,
org.springframework.boot.active.function.client.ClientHttpConnectorAutoConfiguration,
org.springframework.boot.active.function.client.WebClientAutoConfiguration,
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,
org.springframework.boot.autoconfigure.ErrorMvcAutoConfiguration,
org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,
org.springframework.boot.active.WebSocketReactiveAutoConfiguration,
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration,
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration,
org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration,
org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration

每一个这样的xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中,用他们来做自动配置。

3)每一个自动配置类进行自动配置功能:

4)以HttpEncodingAutoConfiguration 为例子解释自动化配置原理;

@Configuration(proxyBeanMethods = false
) //表示这是一个配置类(和之前的配置文件一样),也可以给容器中添加组件
@EnableConfigurationProperties({ServerProperties.class}) //启动指定类
//ConfigurationProperties功能;将配置文件中的对应的值和ServerProperties绑定。@ConditionalOnWebApplication(//Spring 底层Conditional 注解,根绝不同的条件,如果满足指定条件,整个配置类里面的配置才会生效。type = Type.SERVLET //判断当是否是web应用。
)
@ConditionalOnClass({CharacterEncodingFilter.class}) //判断当前项目是否有这个(CharacterEncodingFilter)类
//CharacterEncodingFilter :springmvc中进行乱码解决的过滤器。
@ConditionalOnProperty(//判断配置文件中是否存在ding配置,若不存在,判断也是成立的prefix = "ding",value = {"enabled"},matchIfMissing = true//即使配置文件中不配置abled=true,也是生效的。
)

根据当前不同条件判断,决定这个配置类是否生效。

一但这个配置类讪笑,这个配置类就会给容器中添加各种组件,这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性是和配置文件绑定的。

5)所有在配置文件中能配置的属性都是在xxxProperties类中封装着,配置文件能配置那些属性就可以参照某个功能对应的这个属性类。

SpringBoot精髓:

​ 1)SpringBoot 启动会加载大量的自动配置类信息;

​ 2)看需要的功能在SpringBoot默认配置中是否有;

​ 3)再来看这个自动配置类中到底配置那些组件(只要我们要用的组件有某些属性,就不需要再来配置);

​ 4)给容器中挂自动配置类添加组件的时候,会从properties类中获取某些属性。可以在配置文件中指定这些属性的值;

总结:xxxAutoConfiguration :自动配置类,给容器添加组件;xxxProperties :封装配置文件中相关属性;

4.注解细节解释

1)@Conditional (spring 原生注解)派生注解

​ 作用:必须是@Conditional指定条件成立,才给容器中添加组件,配置类里的所有内容才生效;

@Conditional扩展注解作用(判断是否满足当前指定条件)
@ConditionalOnJava系统的java版本是否符合要求
@ConditionalOnBean容器中存在指定Bean;
@ConditionalOnMissingBean容器中不存在指定Bean;
@ConditionalOnExpression满足SpEL表达式指定
@ConditionalOnClass系统中有指定的类
@ConditionalOnMissingClass系统中没有指定的类
@ConditionalOnSingleCandidate容器中只有一个指定的Bean,或者这个Bean是首选Bean
@ConditionalOnProperty系统中指定的属性是否有指定的值
@ConditionalOnResource类路径下是否存在指定资源文件
@ConditionalOnWebApplication当前是web环境
@ConditionalOnNotWebApplication当前不是web环境
@ConditionalOnJndiJNDI存在指定项

自动配置类必须在一定的条件下才能生效;

怎么知道哪些自动配置类生效?

可以通过启用 debug=true(在properties上添加)属性;让控制台打印自动配置报告。

============================
CONDITIONS EVALUATION REPORT
============================Positive matches:
-----------------AopAutoConfiguration matched:- @ConditionalOnProperty (spring.aop.auto=true) matched (OnPropertyCondition)AopAutoConfiguration.ClassProxyingConfiguration matched:- @ConditionalOnMissingClass did not find unwanted class 'org.aspectj.weaver.Advice' (OnClassCondition)- @ConditionalOnProperty (spring.aop.proxy-target-class=true) matched (OnPropertyCondition)

里面包含配上上的配置类和没有匹配上的配置类的详情。

时间:2021-10-08

耗时:5小时

本文发布于:2024-01-29 12:45:24,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170650353015375.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:Spring   Boot
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23