码迷,mamicode.com
首页 > 编程语言 > 详细

springboot的自动配置

时间:2018-05-19 18:37:53      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:cond   jpa   names   aop   ring   framework   初始化   data   没有   

我们已经在搭建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的自动配置

标签:cond   jpa   names   aop   ring   framework   初始化   data   没有   

原文地址:https://www.cnblogs.com/xiangkejin/p/9060677.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!