Spring Boot自动配置知识点分析

一、配置文件分析

Spring boot使用一个全局的配置文件(配置文件名是固定的):

  • application.properties
  • application.yml

配置文件放在src/mian/resource目录货或者类路径下的/config下。

.yml是YAML语言的文件,以数据为中心,比json、xml等更适合做配置文件,具体参考:http://www.yaml.org(参考语法规范)。

1、yml配置

server:
  port: 8081
  path:/hello

k:(空格)v:标识一对键值对(空格必须有)
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的
属性和值也是大小写敏感的

2、properties配置

user.name=test
user.age=18

3、怎么将配置文件中值,映射到我们组件中

(1)、@ConfigurationProperties:通过这个注解进行绑定

实例:

/**
 * 将配置文件中配置的每个属性的值,映射到这个组件中
 * @ConfigurationProperties: 告诉Spring Boot将本类中的所有属性和配置文件中相关的配置进行绑定
 * prefix = "user":配置文件中哪个下面的所有属性一一映射,默认从全局配置文件中去取
 *
 * 生效条件:只有这个组件是容器中的组件,才能用容器中的这个@ConfigurationProperties功能
 */
@ConfigurationProperties(prefix = "user")
public class User {

    private Integer id;

    private String name;

    private Integer age;
}
user:
  name: test
  age: 18

扩展:我们可以导入配置文件处理器,以后编写配置就有提示了:

<!--导入配置文件处理器,有了这个我们的配置文件中自定义的属性就有绑定就有提示-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

(2)、通过@Value注解进行赋值

 @Value("user.name")
    private String name;

(3)、@ConfigurationProperties与@Value的区别

(4)、可以通过@PropertySource导入指定文件的配置,如下:

@PropertySource(value = {"classpath:user.properties"})
@ConfigurationProperties(prefix = "user")
public class User {

    private Integer id;

    @Value("user.name")
    private String name;

    private Integer age;
}

(5)、@ImportResource

spring boot推荐使用@Bean的方式进行注册。

4、Profile多环境支持

(1)、通过spring.profiles.active=dev配置进行环境切换

实例:

这个里面有两个环境,通过在application.properties文件中增加spring.profiles.active=dev进行切换。

(2)、可以通过启动jar的时候,通过命令行参数进行指定环境切换

(3)、通过虚拟机参数进行环境指定-DSpring.profiles.active=dev

二、配置的加载顺序

还可以通过外部进行加载配置:

加载配置是由外到内

二、自动配置的原理

Spring boot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration

@EnableAutoConfiguration的作用分析:

跟踪到注解里面:

@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

利用EnableAutoConfigurationImportSelector.给容器中导入一些组件。

可以查看selectImports()方法的内容:

List<String> configurations = getCandidateConfigurations(annotationMetadata,
      attributes);//获取候选的配置

以上方法的作用 ,里面有个方法:SpringFactoriesLoader.loadFactoryNames(),这个方法就是扫描所有jar包类路径下的:

META-INF/spring.factories

把扫描到的这些文件的内容保存为properties对象。 

从 properties中获取到EnableAutoConfiguration.class类(类名)对应的值,把他放在容器中。

总结:就是将类路径下的META-INF/spring.factories里面配置的所有EnableAutoConfiguration的值加入到容器中。

每个图中的***AutoConfiguration类都是容器中的一个组件,都加入到了容器中,用他们来做自动配置。

2、自动配置案例分析

HttpEncodingAutoConfiguration解析自动配置原理

@Configuration(proxyBeanMethods = false) 
@EnableConfigurationProperties(HttpProperties.class)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {



@Configuration:这个就是我们spring中的配置类,声明这个类是一个配置类。

@EnableConfigurationProperties:启用指定类的ConfigurationProperties功能

ConfigurationProperties功能将配置文件中对应的值和HttpProperties类绑定起来。

/************HttpProperties.class类的内容******************/
@ConfigurationProperties(prefix = "spring.http") //从配置文件中获取指定值和bean的属性进行绑定
public class HttpProperties {


/**************@ConditionalOnWebApplication*******************/
这个是Spring底层的@Conditional注解,根据不同的条件,
如果满足指定的条件,整个配置类里面的配置就会生效,  
这个注解里面它会去spring的整个容器中去找相关的组件,
如果存在就加载进来,比如有AOP的组件,找到了,就给加载进来。

从以上分析得:

所有在配置文件中能配置的属性都在***Properties类中封装着,所以配置文件能配置什么就可以参照某个功能对应的这个属性类。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值