springboot的自動配置
阿新 • • 發佈:2018-05-19
ogr aop 9.png 中修改 TP fin href data contex @EnableAutoConfiguration裏通過@Import導入了
進入他的父類
找到
我們已經在搭建springboot工程的時候體會到了配置的簡潔性,沒有了之前使用spring所需配置的繁瑣。
那麽springboot是如何做到的呢?
我們在啟動類中都要添加@SpringBootApplication,有了這個註解馬上就能夠讓整個應用跑起來。
實際上它只是一個組合註解,包含@Configuration、@EnableAutoConfiguration、@ComponentScan這三個註解。
從啟動類的@SpringBootApplication進入,在裏面找到了@EnableAutoConfiguration,
@EnableAutoConfiguration裏通過@Import導入了EnableAutoConfigurationImportSelector
,
進入他的父類AutoConfigurationImportSelector
找到selectImports()
方法,他調用了getCandidateConfigurations()
方法,在這裏,這個方法又調用了Spring Core包中的loadFactoryNames()
方法。這個方法的作用是,會查詢META-INF/spring.factories
文件中包含的JAR
文件。
當找到spring.factories文件後,SpringFactoriesLoader將查詢配置文件命名的屬性。
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 boot autoconfigure裏面的MongoAutoConfiguration(mongodb的自動配置),相信你就會明白這套自動配置機制到底是怎麽一回事兒:
@Configuration @ConditionalOnClass({MongoClient.class}) @EnableConfigurationProperties({MongoProperties.class}) //開啟屬性註入。 @ConditionalOnMissingBean( type = {"org.springframework.data.mongodb.MongoDbFactory"} ) public class MongoAutoConfiguration { @Autowired private MongoProperties properties; @Autowired( required = false ) private MongoClientOptions options; @Autowired private Environment environment; private MongoClient mongo; public MongoAutoConfiguration() { } @PreDestroy public void close() { if(this.mongo != null) { this.mongo.close(); } } @Bean //使用java配置,當容器中沒有這個bean的時候執行初始化 @ConditionalOnMissingBean public MongoClient mongo() throws UnknownHostException { this.mongo = this.properties.createMongoClient(this.options, this.environment); return this.mongo; } }
首先這被@Configuration註解了,是一個配置類,當滿足以下條件這個bean被裝配:
-
當MongoClient在類路徑下。
-
當容器中沒有org.springframework.data.mongodb.MongoDbFactory這類bean的時候。
此外,我們可以看一下通過@EnableConfigurationProperties({MongoProperties.class}) 自動註入的屬性
@ConfigurationProperties( prefix = "spring.data.mongodb" ) public class MongoProperties { public static final int DEFAULT_PORT = 27017; private String host; private Integer port = null; private String uri = "mongodb://localhost/test"; private String database; private String authenticationDatabase; private String gridFsDatabase; private String username; private char[] password; private Class<?> fieldNamingStrategy; ...... }
所以在我們什麽都不幹的情況下,只需要引入spring-data-mongodb這個依賴再加上默認的MongoDB server我們就能夠快速集成MongoDB,用MongodbTemplate訪問數據庫。
同時我們可以通過在application.yaml中修改spring.data.mongodb相關的參數就能夠修改連接配置,如:
spring: data: mongodb: host: localhost port: 27017 username: chingzhu password: test123 database: icekredit
springboot的自動配置