SpringBoot 自動配置主要經過
@EnableAutoConfiguration
,@Conditional
,@EnableConfigurationProperties
或者@ConfigurationProperties
等幾個註解來進行自動配置完成的。
@EnableAutoConfiguration
開啓自動配置,主要做用就是調用Spring-Core
包裏的loadFactoryNames()
,將autoconfig
包裏的已經寫好的自動配置加載進來。
@Conditional
條件註解,經過判斷類路徑下有沒有相應配置的jar
包來肯定是否加載和自動配置這個類。
@EnableConfigurationProperties
的做用就是,給自動配置提供具體的配置參數,只須要寫在application.properties
中,就能夠經過映射寫入配置類的POJO
屬性中。java
@Enable*註釋並非SpringBoot
新發明的註釋,Spring 3框架就引入了這些註釋,用這些註釋替代XML配置文件。好比:
@EnableTransactionManagement
註釋,它可以聲明事務管理
@EnableWebMvc
註釋,它能啓用Spring MVC
@EnableScheduling
註釋,它能夠初始化一個調度器。web
@Import
註釋導入。EnableAutoConfigurationImportSelector
,AutoConfigurationImportSelector
selectImports()
方法,他調用了getCandidateConfigurations()
方法,在這裏,這個方法又調用了Spring Core包中的loadFactoryNames()
方法。這個方法的做用是,會查詢META-INF/spring.factories
文件中包含的JAR
文件。Jar
文件在org.springframework.boot.autoconfigure的spring.factories
spring.factories
內容以下(截取部分),在這個文件中,能夠看到一系列Spring Boot自動配置的列表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,\
這個類進行了簡單的Spring配置,聲明瞭Redis所需典型Bean,和其它不少類同樣,重度依賴於Spring Boot註釋:
1)@ConditionOnClass激活一個配置,當類路徑中存在這個類時纔會配置該類
2)@EnableConfigurationProperties自動映射一個POJO到Spring Boot配置文件(默認是application.properties文件)的屬性集。
3)@ConditionalOnMissingBean啓用一個Bean定義,但必須是這個Bean以前未定義過纔有效。
還可使用@ AutoConfigureBefore註釋、@AutoConfigureAfter註釋來定義這些配置類的載入順序。redis
此註釋使得只有在特定條件知足時才啓用一些配置。SrpingBoot的AutoConfig大量使用了@Conditional,它會根據運行環境來動態注入Bean。這裏介紹一些@Conditional的使用和原理,並自定義@Conditional來自定義功能。spring
僅僅在當前上下文中存在某個對象時,纔會實例化一個Beanexpress
某個class位於類路徑上,纔會實例化一個Bean),該註解的參數對應的類必須存在,不然不解析該註解修飾的配置類springboot
當表達式爲true的時候,纔會實例化一個Bean微信
僅僅在當前上下文中不存在某個對象時,纔會實例化一個Bean,該註解表示,若是存在它修飾的類的bean,則不須要再建立這個bean,能夠給該註解傳入參數例如@ConditionOnMissingBean(name = "example"),這個表示若是name爲「example」的bean存在,這該註解修飾的代碼塊不執行app
某個class類路徑上不存在的時候,纔會實例化一個Bean框架
不是web應用時,纔會執行webapp
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "may")
在須要注入配置的類上加上這個註解,prefix的意思是,以該前綴打頭的配置,如下是例子
@ConfigurationProperties(prefix = "may") public class User { private String name; private String gender; //省略setter,getter方法 }
application.yml中的配置
may name: youjie gender: man
若是不用系統初始的application.yml配置類,而是使用本身的如youjie.yml,能夠以下配置
@ConfigurationProperties(prefix = "may",locations = "classpath:youjie.yml") public class User2 { private String name; private String gender; //省略setter,getter方法 }
過期:因爲Spring-boot 1.5.2版本移除了,locations這個屬性,所以上述這種方式在最新的版本中過期。
@PropertySource
Spring-boot 1.5.2版本以後,採用下面這種方式
@Component //@PropertySource只能加載.properties文件,須要將上面的yml文件,改成.properties文件 @PropertySource("classpath:may.properties") @ConfigurationProperties(prefix="may") public class User2 { private String name; private String gender; //省略setter,getter方法 }
@EnableConfigurationProperties
最後注意在spring Boot入口類加上@EnableConfigurationProperties
@SpringBootApplication @EnableConfigurationProperties({User.class,User2.class}) public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
其實這裏@EnableConfigurationProperties({User.class,User2.class}) 能夠省略
SpringBoot 的 自動配置得益於 SpringFramework 強大的支撐,框架早已有不少工具和註解能夠自動裝配 Bean 。SpringBoot 經過 一個封裝,將市面上通用的組件直接寫好了配置類。當咱們程序去依賴了這些組件的 jar 包後,啓動 SpringBoot應用,因而自動加載開始了。
咱們也能夠定義本身的自動裝配組件,依賴以後,Spring直接能夠加載咱們定義的 starter 。筆者將在後續文章中進行編碼和解讀。