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,
@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