1. 程式人生 > >springboot的自動配置

springboot的自動配置

ogr aop 9.png 中修改 TP fin href data contex

我們已經在搭建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的自動配置