1. 程式人生 > >SpringBoot的自動配置原理

SpringBoot的自動配置原理

1、屬性配置類

其實就是值物件注入的方式去配置一些Spring常用的配置,我們編寫一個最簡單的配置物件

@ConfigurationProperties(prefix = "hello")
//@Component //如果這裡添加了註解那麼在自動配置類的時候就不用新增@enableConfigurationProperties(HelloProperties.class)註解.
public class HelloProperties {

    private String msg="default";//現在我們在配置檔案寫hello.msg=world,因為簡單就不再展示;如果那麼預設為default.
public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }

這是一個簡單的屬性值物件,那麼相當於寫死的欄位就是SpringBoot為我們自動配置的配置,那麼我們很多時候可以自己在application.properties中修改某些配置就是這樣的道理,我們不設定就是預設的,設定了就是我們設定的屬性。

2、自動配置類

上面已經構建了我們簡單的屬性物件,那麼現在我們要通過屬性物件得到相應的屬性值將其注入到我們的Bean中,這些Bean也就是一些SpringBoot啟動後為我們自動配置生成的Bean,當然SpringBoot優先使用我們配置的Bean這個功能是如何實現的,我們往下看一下就明白了。
首先我們需要一個功能Bean,可以把這個Bean看做是SpringBoot框架啟動後在容器裡面生成的為我們服務的內建Bean,簡單的寫一個。

//@Component   這裡很重要,如果我們添加了這個註解那麼,按照我們下面的設定SpringBoot會優先使用我們配置的這個Bean,這是符合SpringBoot框架優先使用自定義Bean的原則的。
public class HelloService {

    private String msg = "service";//如果自動配置沒有讀入成功,那麼為預設值

    public String say() {
        return "hello " + msg;
    }//為我們服務的方法

    public String getMsg() {
        return
msg; } public void setMsg(String msg) { this.msg = msg; } }

現在編寫我們的自動配置類。

@Configuration //配置類
@EnableConfigurationProperties(HelloProperties.class)//這裡就是前面說的,這個註解讀入我們的配置物件類
@ConditionalOnClass(HelloService.class)//當類路徑存在這個類時才會載入這個配置類,否則跳過,這個很有用比如不同jar包間類依賴,依賴的類不存在直接跳過,不會報錯
public class HelloAutoConfiguration {

    @Autowired
    private HelloProperties helloProperties;

    @Bean
    @ConditionalOnMissingBean(HelloService.class)//這個配置就是SpringBoot可以優先使用自定義Bean的核心所在,如果沒有我們的自定義Bean那麼才會自動配置一個新的Bean
    public HelloService auto(){
        HelloService helloService =new HelloService();
        helloService.setMsg(helloProperties.getMsg());
        return helloService;
    }

}

3、測試自動配置

@SpringBootApplication
@RestController
public class MyRun {

    @Autowired
    private HelloService helloService;

    @RequestMapping("/auto/home")
    public String home(){
        return helloService.say();
    }

    public static void main(String[] args) {
        SpringApplication.run(MyRun.class,args);
    }
}

4、SpringBoot管理自動配置

其實在很多時候我們的配置是在很多jar包裡的,那麼我們新的應用該怎麼讀入這些jar包裡的配置檔案呢,SpringBoot是這樣管理的。

最主要的註解就是@EnableAutoConfiguration,而這個註解會匯入一個EnableAutoConfigurationImportSelector的類,而這個類會去讀取一個spring.factories下key為EnableAutoConfiguration全限定名對應值.
注意到這個類是位於org.springframework.boot.autoconfigure; 包下,由此可見這個類就是我們自動配置實現的關鍵。

# Auto Configure
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.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration,\
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.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.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,\
org.springframework.boot.autoconfigure.elasticsearch.jest.JestAutoConfiguration,\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\
org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\
org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\
org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\
org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\
org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\
org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\
org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\
org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.hornetq.HornetQAutoConfiguration,\
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\
org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.DeviceResolverAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.DeviceDelegatingViewResolverAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.SitePreferenceAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration,\
org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.SecurityFilterAutoConfiguration,\
org.springframework.boot.autoconfigure.security.FallbackWebSecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.OAuth2AutoConfiguration,\
org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\
org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\
org.springframework.boot.autoconfigure.social.SocialWebAutoConfiguration,\
org.springframework.boot.autoconfigure.social.FacebookAutoConfiguration,\
org.springframework.boot.autoconfigure.social.LinkedInAutoConfiguration,\
org.springframework.boot.autoconfigure.social.TwitterAutoConfiguration,\
org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\
org.springframework.boot.autoconfigure.velocity.VelocityAutoConfiguration,\
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\
org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration,\
org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.web.HttpEncodingAutoConfiguration,\
org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration,\
org.springframework.boot.autoconfigure.web.MultipartAutoConfiguration,\
org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration,\
org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketMessagingAutoConfiguration,\
org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration

可以發現這裡面定義的類,名字大多都是以****AutoConfiguration 為主,在Spring的自動配置開啟之後,會自動的去讀取這些該檔案的內容,從而進行對每一個類自動配置。

5、SpringBoot自動配置的核心註解

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication 




@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({EnableAutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration 

相關推薦

SpringBoot自動配置原理

override activity eve rop 哪些 isf 代碼 文件 multi SpringBoot自動配置原理 備註:該SpringBoot自動配置原理不適合java剛入門學者以及不熟悉Spring4+Springmvc+maven的同學 1、當Sprin

SpringBoot-自動配置原理

factory ESS bean att cond active tor 條件判斷 common 可配置項參考: https://docs.spring.io/spring-boot/docs/2.0.1.BUILD-SNAPSHOT/reference/htmlsingl

(轉)入門SpringBoot-自動配置原理(三)

leg ebs jdbc 路徑 ket dao posit 把他 exc 1、自動配置原理: 1)、SpringBoot啟動的時候加載主配置類,開啟了自動配置功能 ==@EnableAutoConfiguration== 2)、@EnableAutoConfigurat

SpringBoot專欄:SpringBoot自動配置原理以及細節(第三講)

  自動配置原理 1)、SpringBoot啟動的時候載入主配置類,開啟了自動配置功能 @EnableAutoConfiguration 2)、@EnableAutoConfiguration 作用:        利用EnableA

SpringBoot學習筆記(三) SpringBoot 自動配置原理

SpringBoot自動配置 SpringBoot自動配置的註解是@EnableAutoConfiguration 所以來看@EnableAutoConfiguration註解的原始碼: 1、首先@EnableAutoConfiguration是包含在@S

springboot 自動配置原理

8、自動配置原理 配置檔案到底能寫什麼?怎麼寫?自動配置原理; 配置檔案能配置的屬性參照   1、自動配置原理: 1)、SpringBoot啟動的時候載入主配置類,開啟了自動配置功能 @EnableAutoConfiguration 2)、@EnableAutoConfigu

Springboot第二章 springboot 自動配置原理

springboot 官方文件記錄了properties/yml   能寫的所有配置 1、自動配置原理: 1)Sprintboot 啟動的時候,載入住配置類,開啟自動配置功能, @EnableAutoConfiguration 利用 @Import(Auto

我是如何做到springboot自動配置原理解析

一前言 springboot 2.0.0版本分析,整體的自動配置流程如下: 具體配置參考官方文件:springboot-doc 二 @SpringBootApplication 核心註解@SpringBootConfiguration其實就是@Configuration註解,表示是個配置類;@Enable

SpringBoot自動配置原理原始碼級別分析

# SpringBoot自動配置原理 ### 前言 後面還會講到SpringBoot自動配置原理,會主要講解@EnableAutoConfiguratuon註解幫助我們做了什麼事情,是如何自動把自動配置類掃描到容器中的,建議看完這篇後,兩篇配合使用,[傳送門](https://blog.csdn.net/

SpringBoot自動配置原理過程解析

分享 類的方法 通過 fff 註解 autoconf resource name bsp SpringBoot的最大好處就是實現了大部分的自動配置,使得開發者可以更多的關註於業務開發,避免繁瑣的業務開發,但是SpringBoot如此好用的 自動註解過程著實讓人忍不住的去了解

springboot 2.* 自動配置原理探究&demo實現

springboot-2.1.0 自動配置原理解析&demo實現 前言 最近準備升級線上服務的版本到springboot 2.1.0,所以抽空重新研究學習了下springboot的一些特性、原理。本文的核心就是學習理解下springboot的自動配置原理,版本是目前springboot的最新rel

SpringBoot——web開發之SpringMVC自動配置原理

一、SpringBoot為SpringMVC提供的自動配置 2、SpringBoot為SpringMVC提供的自動配置:參考類WebMvcAutoConfiguration ①Inclusion of ContentNegotiatingViewResolver an

JAVAEE——SpringBoot配置配置檔案、YAML語法、檔案值注入、載入位置與順序、自動配置原理

# Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAu

SpringBoot】spring-boot-自動配置原理

思考:配置檔案到底能寫什麼?怎麼寫?自動配置原理; 1.自動配置原理 springboot自動配置主演通過@EnableConfiguration,@Conditional,@EnableConfigurationProperties或者@ConfiguraionProp

SpringBoot自動配置註解原理解析

1. SpringBoot啟動主程式類: 1 @SpringBootApplication 2 public class DemoApplication { 3 public static void main(String[] args) { 4 5 SpringApp

SpringBoot學習_SpringMVC自動配置原理

官方文件中對SpringMVC自動配置的說明 翻譯: 以下是SpringBoot對 SpringMVC的預設配置,都在(WebMvcAutoConfiguration)這個類中: Inclusion of ContentNegotiatingViewResol

springboot 自動配置原理

在spring程式main方法中 新增@SpringBootApplication或者@EnableAutoConfiguration         會自動去maven中讀取每個starter中的spring.factories檔案  該檔案裡配置了所有需要被建立sprin

SpringBoot自動配置原理及實現

SpringBoot自動配置的實現原理 SpringBoot的核心就是自動配置,自動配置又是基於條件判斷來配置Bean。關於自動配置的原始碼在spring-boot-autoconfigure-2.0.3.RELEASE.jar 回顧配置屬性 在通常需要我們在

springboot——springboot自動配置原理

在我們使用springboot的時候,感覺很方便,它提倡的 '習慣優於配置' 給開發人員帶來了很大的方便。但是當一些小白在使用的時候,經常不理解是如何實現自動配置的。在spring中提供了一種基於條件來配置bean的方式來實現bean的配置。其實springboot也基於了這

SpringBoot與資料訪問JDBC&自動配置原理(一)

1、建立專案(通過idea)這裡的mysql就是幫助我們匯入mysql驅動的。然後通過專案下的pom.xml檔案,可以發現我們匯入了下面這些依賴。我們在使用最基本的jdbc的時候,我們只要引入jdbc和mhysql驅動就可以了。2、與資料庫連線  啟動資料庫我這裡是通過php