一、配置文件分析
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類中封裝着,所以配置文件能配置什麼就可以參照某個功能對應的這個屬性類。