springboot 配置檔案以及自動配置
1.springboot 預設配置檔案
SpringBoot使用預設的全域性的配置檔案,application.properties / application.yml,配置檔名固定。
2.為什麼需要配置檔案
我們知道SpringBoot在底層給我們自動做了一些配置,所以springboot專案不編寫配置檔案也可以正常執行,但是根據我們的具體開發我們需要修改SpringBoot自動配置的預設值
3.讀取application.yml配置檔案
- Person.java
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;//此處省略Dog類的bean實現,只有兩個簡單的屬性{name:steven,age:2}
@Override
public String toString() {
return "Person [lastName=" + lastName + ", age=" + age + ", boss="
+ boss + ", birth=" + birth + ", maps=" + maps + ", lists="
+ lists + ", dog=" + dog + "]";
}
//此處省略get set 方法
...
- application.yml
person:
lastName: zhansan
age: 18
boss: false
birth: 2017/12/12
maps: {k1: 12,k2: 12}
lists:
- lisi
- wangwu
dog:
name: steven
age: 2
- Test.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class Test{
@Autowired
Person person;
@Test
public void contextLoads() {
System.out.println(person);
}
}
//Person{lastName='zhansan', age=18, boss=false, birth=Tue Dec 12 00:00:00 CST 2017,
//maps={k1=12, k2=12}, lists=[lisi, wangwu], dog=Dog{name='steven', age=2}}
這個簡單的demo就完成了,也得到了我們期望的結果,其中最重要的是@ConfigurationProperties,@Component這兩個註解。
@ConfigurationProperties
:告訴SpringBoot將本類中的所有屬性和配置檔案中相關的配置進行繫結;@ConfigurationProperties(prefix = "person"
):預設從全域性配置檔案中獲取值;prefix = "person"
:配置檔案中哪個(person)下面的所有屬性進行一一對映;只有這個元件是容器中的元件,才能使用容器提供的
@ConfigurationProperties
功能; 所有我們為Person類加上@Component
註解
4.自動配置原理
1. SpringBoot啟動的時候載入主配置類,開啟了自動配置功能 @EnableAutoConfiguration
2.@EnableAutoConfiguration
作用:利用EnableAutoConfigurationImportSelector
給容器中匯入一些元件
EnableAutoConfigurationImportSelector
在1.5中已經棄用,這裡我們不深究,看到它的父類AutoConfigurationImportSelector
中的selectImports
方法
List configurations = getCandidateConfigurations(annotationMetadata, attributes);獲取候選的配置
3.getCandidateConfigurations()
方法呼叫了SpringFactoriesLoader.loadFactoryNames()
方法,下面我們具體來看看這個方法的實現
掃描所有jar包類路徑下 META‐INF/spring.factories;
把掃描到的這些檔案的內容包裝成properties物件;
從properties中獲取到EnableAutoConfiguration.class類(類名)對應的值,然後把他們新增在容器中;
即將 類路徑下 META-INF/spring.factories
裡面配置的所有EnableAutoConfiguration
的值加入到了容器中。
4..META-INF/spring.factories內容
# 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.CassandraRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
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.MongoRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\
org.springframework.boot.autoconfigure.elasticsearch.jest.JestAutoConfiguration,\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\
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.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.flyway.FlywayAutoConfiguration,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\
org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\
org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\
org.springframework.boot.autoconfigure.ldap.embedded.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.boot.autoconfigure.mobile.DeviceResolverAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.DeviceDelegatingViewResolverAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.SitePreferenceAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration,\
org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.SecurityFilterAutoConfiguration,\
org.springframework.boot.autoconfigure.security.FallbackWebSecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.OAuth2AutoConfiguration,\
org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\
org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\
org.springframework.boot.autoconfigure.social.SocialWebAutoConfiguration,\
org.springframework.boot.autoconfigure.social.FacebookAutoConfiguration,\
org.springframework.boot.autoconfigure.social.LinkedInAutoConfiguration,\
org.springframework.boot.autoconfigure.social.TwitterAutoConfiguration,\
org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\
org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,\
org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration,\
org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.web.HttpEncodingAutoConfiguration,\
org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration,\
org.springframework.boot.autoconfigure.web.MultipartAutoConfiguration,\
org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration,\
org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketMessagingAutoConfiguration,\
org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration
5.具體分析HttpEncodingAutoConfiguration
原理
@Configuration
@EnableConfigurationProperties(HttpEncodingProperties.class)
@ConditionalOnWebApplication
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {
private final HttpEncodingProperties properties;
public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
this.properties = properties;
}
@Bean //給容器中新增一個元件,這個元件的某些值需要從properties中獲取,properties中的個屬性是和配置檔案繫結的。
@ConditionalOnMissingBean(CharacterEncodingFilter.class)//容器沒有CharacterEncodingFilter元件時生效
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;
}
}
@Configuration
: 定義配置類。@EnableConfigurationProperties(HttpEncodingProperties.class)
:啟動指定類的ConfigurationProperties功能;
將配置檔案中對應的值和HttpEncodingProperties繫結起來;並把HttpEncodingProperties加入到ioc容器中。- `@ConditionalOnWebApplication:判斷當前應用是否是web應用,如果是,當前配置類生效
- @ConditionalOnClass(CharacterEncodingFilter.class)`:判斷當前專案有沒有這個類,CharacterEncodingFilter:SpringMVC中解決亂碼的過濾器。
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
://判斷配置檔案中是否存在某個配置 spring.http.encoding.enabled;matchIfMissing表示,即使我們配置檔案中不配置spring.http.encoding.enabled=true,也是預設生效的;@Conditional
註解(Spring註解版),條件註解,通過判斷類路徑下有沒有相應配置的jar包來確定是否載入和自動配置這個類。- 所有在配置檔案中能配置的屬性都是在xxxxProperties類中封裝的,配置檔案的配置項就可以參照其對應的這個屬性類。
//從配置檔案中獲取指定的值和bean的屬性進行繫結
@ConfigurationProperties(prefix = "spring.http.encoding")
public class HttpEncodingProperties {
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
...
}
小結:
1)、SpringBoot啟動會載入大量的自動配置類;
2)、首先檢查SpringBoot預設的自動配置類是否滿足我們的需求;
3)、具體檢視這個自動配置類中配置了哪些元件;
4)、給容器中的自動配置類新增元件的時候,會從properties類中獲取某些屬性。我們就可以在配置檔案中指定這
些屬性的值;
5)、xxxxAutoConfigurartion:自動配置類,給容器中新增元件;xxxxProperties:封裝配置檔案中相關屬性;
[email protected]派生註解瞭解
核心:@Conditional指定的條件成立,才給容器中新增元件,配置類裡面的所有內容才生效;即,自動配置類必須在一定的條件下才能生效;
@ConditionalOnJava
:系統的java版本是否符合要求
@ConditionalOnBean
:容器中存在指定Bean;
@ConditionalOnMissingBean
:容器中不存在指定Bean;
@ConditionalOnExpression
:滿足SpEL表示式指定
@ConditionalOnClass
:系統中有指定的類
@ConditionalOnMissingClass
: 系統中沒有指定的類
@ConditionalOnSingleCandidate
:容器中只有一個指定的Bean,或者這個Bean是首選Bean
@ConditionalOnProperty
:系統中指定的屬性是否有指定的值
@ConditionalOnResource
:類路徑下是否存在指定資原始檔
@ConditionalOnWebApplication
:當前是web環境
@ConditionalOnNotWebApplication
:當前不是web環境
檢視生效的配置類:
啟用 debug=true
屬性,來檢視控制檯列印的自動配置報告。
=========================
AUTO-CONFIGURATION REPORT
=========================
Positive matches://匹配成功,啟用的自動配置類
-----------------
DispatcherServletAutoConfiguration matched:
- @ConditionalOnClass found required class 'org.springframework.web.servlet.DispatcherServlet'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)
- @ConditionalOnWebApplication (required) found StandardServletEnvironment (OnWebApplicationCondition)
DispatcherServletAutoConfiguration.DispatcherServletConfiguration matched:
- @ConditionalOnClass found required class 'javax.servlet.ServletRegistration'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)
- Default DispatcherServlet did not find dispatcher servlet beans (DispatcherServletAutoConfiguration.DefaultDispatcherServletCondition)
...
...
...
Negative matches://匹配失敗,未啟用的自動配置類
-----------------
ActiveMQAutoConfiguration:
Did not match:
- @ConditionalOnClass did not find required classes 'javax.jms.ConnectionFactory', 'org.apache.activemq.ActiveMQConnectionFactory' (OnClassCondition)
AopAutoConfiguration:
Did not match:
- @ConditionalOnClass did not find required classes 'org.aspectj.lang.annotation.Aspect', 'org.aspectj.lang.reflect.Advice' (OnClassCondition)
...
...