一、配置文件分析
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类中封装着,所以配置文件能配置什么就可以参照某个功能对应的这个属性类。