2-2 Springboot自動配置Bean原理和配置自動配置的Bean

認識Springboot

    SpringBoot不是什麼

    不是應用服務器

    不是JavaEE之類的規範

    不是代碼生成器

    不是Spring Framework的升級版(幫助大家更好地使用Spring Framework)

 

SpringBoot的特性

    方便地創建可獨立運行的Spring應用程序

    直接內嵌了Tomcat、Jetty、Undertow

    簡化了項目的構建配置

    爲Spring及第三方庫提供自動配置

    提供生產級特性

    無需生成代碼或進行xml配置

 

SpringBoot的四大核心部分

    自動配置 - Auto Configuration

    起步依賴 - Starter Dependency

    命令行界面 - Spring Boot CLI

    Actuator

 

瞭解自動配置

自動配置

    基於添加了Jar依賴自動對SpringBoot應用程序進行配置

    spring-boot-autoconfiguration

開啓自動配置

    @EnableAutoConfiguration

        exclude = Class<?>[](參考自動配置類的信息)

    @SpringBootApplication

 

自動配置的實現原理

@EnableAutoConfiguration

    AutoConfigurationImportSelector(package org.springframework.boot.autoconfigure;)

    META-INF/spring.factories(org\springframework\boot\spring-boot-autoconfigure\2.1.5.RELEASE\spring-boot-autoconfigure-2.1.5.RELEASE.jar!\META-INF\spring.factories)

        org.springframework.boot.autoconfigure.EnableAutoConfiguration

 

自動配置的實現原理

條件註解

    @Conditional

    @ConditionalOnClass //當條件出現什麼類的時候生效

    @ConditionalOnBean //當容器裏存在某個bean的時候生效

    @ConfitionalOnMissingBean //當容器裏不存在某個bean時生效

    @ConditionalOnProperty //當配置了特定屬性的時候  

    例:@ConditionOnProperty(name="xxx.enable",havingValue="true",matchIfMissing="false") 

bean條件

    @ConditionalOnBean

    @ConditionalOnMissingBean

    @ConditionalOnSingleCandidate

資源條件

    @ConditionOnResource

Web應用條件

    @ConditionalOnWebApplication

    @ConditionalOnNotWebApplication

其他條件

    @ConditionalOnExpression

    @ConditionalOnJava

    @ConditionalOnJndi

執行順序

    @AutoConfigureBefore

    @AutoConfigureAfter

    @AutoConfigureOrder

參考org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration
package org.springframework.boot.autoconfigure.jdbc;


/**
 * {@link EnableAutoConfiguration Auto-configuration} for {@link DataSource}.
 *
 * @author Dave Syer
 * @author Phillip Webb
 * @author Stephane Nicoll
 * @author Kazuki Shimizu
 */
@Configuration
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) //當存在這兩類的時候
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ DataSourcePoolMetadataProvidersConfiguration.class,
		DataSourceInitializationConfiguration.class })
public class DataSourceAutoConfiguration {

	@Configuration
	@Conditional(EmbeddedDatabaseCondition.class) //當存在這個類的時候
	@ConditionalOnMissingBean({ DataSource.class, XADataSource.class }) //當不存在這兩個Bean的時候
	@Import(EmbeddedDataSourceConfiguration.class)
	protected static class EmbeddedDatabaseConfiguration {

	}

}

瞭解自動配置的情況

命令行添加 --debug

由ConditionEvaluationReportLoggingListeners輸出

    Positive matches 匹配那些

    Negative matches 沒有匹配到那些

    Exclusions 排除那些

    Unconditional classes 無條件配置

 

-- 摘自極客時間玩轉spring全家桶

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章