springboot的自動配置

Spring Boot理念是約定優於配置,它經過實現了自動配置(大多數用戶平時習慣設置的配置做爲默認配置)的功能來爲用戶快速構建出標準化的應用。Spring Boot的特色能夠概述爲以下幾點:java

  • 內置了嵌入式的Tomcat、Jetty等Servlet容器,應用能夠不用打包成War格式,而是能夠直接以Jar格式運行。web

  • 提供了多個可選擇的」starter」以簡化Maven的依賴管理(也支持Gradle),讓您能夠按需加載須要的功能模塊。redis

  • 儘量地進行自動配置,減小了用戶須要動手寫的各類冗餘配置項,Spring Boot提倡無XML配置文件的理念,使用Spring Boot生成的應用徹底不會生成任何配置代碼與XML配置文件。spring

  • 提供了一整套的對應用狀態的監控與管理的功能模塊(經過引入spring-boot-starter-actuator),包括應用的線程信息、內存信息、應用是否處於健康狀態等,爲了知足更多的資源監控需求,Spring Cloud中的不少模塊還對其進行了擴展。mongodb

Spring Boot的自動配置看起來神奇,其實原理很是簡單,背後全依賴於@Conditional註解來實現的。數據庫

什麼是@Conditional?springboot

@Conditional是由Spring 4提供的一個新特性,用於根據特定條件來控制Bean的建立行爲。而在咱們開發基於Spring的應用的時候,不免會須要根據條件來註冊Bean。app

在業務複雜的狀況下,顯然須要使用到@Conditional註解來提供更加靈活的條件判斷,例如如下幾個判斷條件:elasticsearch

  • 在類路徑中是否存在這樣的一個類。spring-boot

  • 在Spring容器中是否已經註冊了某種類型的Bean(如未註冊,咱們可讓其自動註冊到容器中,上一條同理)。

  • 一個文件是否在特定的位置上。

  • 一個特定的系統屬性是否存在。

  • 在Spring的配置文件中是否設置了某個特定的值。

 

咱們已經在搭建springboot工程的時候體會到了配置的簡潔性,沒有了以前使用spring所需配置的繁瑣。

那麼springboot是如何作到的呢?

咱們在啓動類中都要添加@SpringBootApplication,有了這個註解立刻就可以讓整個應用跑起來。

實際上它只是一個組合註解,包含@Configuration、@EnableAutoConfiguration、@ComponentScan這三個註解。

從啓動類的@SpringBootApplication進入在裏面找到了@EnableAutoConfiguration,

1.png

2.png

@EnableAutoConfiguration裏經過@Import導入了EnableAutoConfigurationImportSelector,

3.png

進入他的父類AutoConfigurationImportSelector

4.png

找到selectImports()方法,他調用了getCandidateConfigurations()方法,在這裏,這個方法又調用了Spring Core包中的loadFactoryNames()方法。這個方法的做用是,會查詢META-INF/spring.factories文件中包含的JAR文件。

5.png

當找到spring.factories文件後,SpringFactoriesLoader將查詢配置文件命名的屬性。

6.png

7.png

Jar文件在org.springframework.boot.autoconfigure的spring.factories

8.png

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

 

參考:Spring Boot 自動配置的 「魔法」 是如何實現的?

相關文章
相關標籤/搜索