SpringBoot最大的的優(yōu)勢就是簡化了SpringMVC中很多繁瑣的配置工作,采用了自動配置以及利用注解的方式代替原來的XML配置的方式來配置工程。
一.Bean的配置
配置JAVA注解 :@Configuration
Bean添加到容器的注解:@Bean
package com.springboot.config;
import com.springboot.service.HelloService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author BaoZhou
* @date 2018/5/4
*/
@Configuration
public class MyAppConfig {
//講方法的返回值添加到容器中
@Bean
public HelloService helloservice() {
System.out.println("配置類@bean給容器中添加組件");
return new HelloService();
}
}
二.多Profile配置
1.properties方式
我們在主配置文件編寫的時候,文件名可以是application-{profile}.properites/yml,模式使用application.properties;選擇某個profile時,只需要用如下代碼:
spring.profiles.active=profile //此處為你定義的profile
2.YML方式
可以利用YML的文件塊特性
server:
port: 8081
spring:
active: dev //此處激活
---
server:
port: 8083
spring:
profiles: dev
---
server:
port: 8084
spring:
profiles: prod
利用橫線(---)進行文件塊的劃分,再需要激活的配置文件部分寫上active,其他用profiles:命名即可
3.命令行
或者在打出JAR包后利用指令--spring.profile.active=dev運行JAR包
4.虛擬機參數(shù)
-Dspring.profiles.active=dev;
三.配置文件的加載路徑
springboot會從以下路徑去搜索配置文件,配置文件名字默認為application.properties/yml
路徑由高到低:
file ../config
file ../
classpath:/confi/g
classpath:/
其中有相同屬性時,優(yōu)先級會覆蓋低優(yōu)先級。有不同屬性時,配置文件之間會形成互補。
四.可配置的屬性
參考SpringBoot官方文檔
五.自動配置原理
通過注釋@SpringBootApplication加載主配置類
方法繼承關(guān)系:
SpringBootApplication注釋
--> EnableAutoConfiguration注釋
--> AutoConfigurationImportSelector.class類
--> getCandidateConfigurations方法
--> SpringFactoriesLoader方法
--> 從META-INF/spring.factories里讀取配置參數(shù)鍵值對
讀取配置參數(shù)代碼如下
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return NO_IMPORTS;
}
AutoConfigurationMetadata autoConfigurationMetadata =
AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
AnnotationAttributes attributes = getAttributes(annotationMetadata);
List<String> configurations =
getCandidateConfigurations(annotationMetadata,attributes);
configurations = removeDuplicates(configurations);
Set<String> exclusions = getExclusions(annotationMetadata, attributes);
checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = filter(configurations, autoConfigurationMetadata);
fireAutoConfigurationImportEvents(configurations, exclusions);
return StringUtils.toStringArray(configurations);
}
首先讀取JAR包中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.CassandraReactiveDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveRepositoriesAutoConfiguration,\
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.MongoReactiveDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
那么自動配置的組件是如何完成自動配置的呢,我們以HttpEncodingAutoConfiguration為例,上面的幾個conditional都是用來判斷配置是否生效。
@Configuration //表示這是一個配置類
@EnableConfigurationProperties(HttpEncodingProperties.class)//啟用configurationProperties功能,把HttpEncodingProperties加入到IOC容器中
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)//條件判斷,滿足條件配置類才能生效,判斷當前應(yīng)用是否為WEB引用
@ConditionalOnClass(CharacterEncodingFilter.class)//條件判斷,判斷當前項目是否有CharacterEncodingFilter.class類
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)//條件判斷,判斷配置文件是否存再spring.http.encoding,假如沒有也返回為true
public class HttpEncodingAutoConfiguration {
EnableConfigurationProperties為配置屬性,我們所能夠配置的屬性都在這個類中。讀取配置文件取指定的值后再與Bean進行綁定。
@ConfigurationProperties(prefix = "spring.http.encoding")
public class HttpEncodingProperties {
private final HttpEncodingProperties properties;
//當只有一個有參構(gòu)造時,他會從IOC容器中讀取
public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
this.properties = properties;
}
@Bean
@ConditionalOnMissingBean
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;
}
自動配置原理小結(jié)
- SpringBoot啟動時會加載大量的自動配置類。
- 我們看我們需要的功能是否有默認的自動配置。
- 查看自動配置類中配置了哪些組件。
- 給容器中自動配置類添加組件的時候,會從properties類中獲取某些屬性,我們就可以在配置文件中設(shè)定這些屬性的值。
xxxxAutoConfiguration:自動配置類
xxxxPropertios:封裝配置文件中相關(guān)屬性
六.有關(guān)于條件篩選@Conditional注釋
SpringBoot再@Conditional又擴展出了多個注解以方面使用:
注解 | 作用 | 例子 |
---|---|---|
@ConditionalOnJava | 系統(tǒng)JAVA版本是否符合要求 | ConditionalOnJava(JavaVersion.EIGHT) |
@ConditionalOnBean @ConditionalOnMissingBean |
容器中(不)存在指定BEAN | @ConditionalOnBean(javax.sql.DataSource.class) |
@ConditionalOnExpression | 滿足SqEL表達式指定 | @ConditionalOnExpression("'${server.host}'=='localhost'") |
@ConditionaOnClass @ConditionalOnMissingClass |
容器中(不)存在指定Class | @ConditionalOnClass({ test.class,test2.class }) |
@ConditionalOnSingleCandidate | 容器中只有一個指定的Bean或者這個Bean是首選Bean | @ConditionalOnSingleCandidate(test.class) |
@ConditionalOnProperty | 系統(tǒng)中指定的屬性是否有指定的值 | @ConditionalOnProperty(prefix = "spring.aop", name = "auto",matchIfMissing = true) |
@ConditionalOnResource | 類路徑下是否有指定的資源文件 | @ConditionalOnResource(resources="mybatis.xml") |
@ConditionalOnWebApplication @ConditionalOnNotWebApplication |
當前(不)是WEB環(huán)境 | 無參數(shù) |
@ConditionalOnjndi | JNDI存在指定項 | -- |
你可以在配置文件中添加
debug=true
在日志中查看在你的項目中啟用了哪些自動配置類
那么有關(guān)于SpringBoot配置文件的相關(guān)學習筆記小結(jié)就到這里了。覺得不錯的話可以點一個喜歡,謝謝大家!