欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring Boot 自動配置的實現(xiàn)

 更新時間:2018年08月10日 10:24:34   作者:David_jim  
這篇文章主要介紹了Spring Boot 自動配置的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

Spring Boot 自動配置

來看下 spring boot中自動配置的注解

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

  String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

  /**
   * Exclude specific auto-configuration classes such that they will never be applied.
   * @return the classes to exclude
   */
  Class<?>[] exclude() default {};

  /**
   * Exclude specific auto-configuration class names such that they will never be
   * applied.
   * @return the class names to exclude
   * @since 1.3.0
   */
  String[] excludeName() default {};

}
  1. exclude() 可以排除一些自動配置的內(nèi)容
  2. excludeName 通過名稱排除自動配置內(nèi)容

再來看下, @EnableAutoConfiguration 是怎么處理自動配置的呢?

注意到@Import(EnableAutoConfigurationImportSelector.class)

public class EnableAutoConfigurationImportSelector
    extends AutoConfigurationImportSelector {

  @Override
  protected boolean isEnabled(AnnotationMetadata metadata) {
    if (getClass().equals(EnableAutoConfigurationImportSelector.class)) {
      return getEnvironment().getProperty(
          EnableAutoConfiguration.ENABLED_OVERRIDE_PROPERTY, Boolean.class,
          true);
    }
    return true;
  }
}

}

再來看下 AutoConfigurationImportSelector ,主要是 接口的 ImportSelector 的實現(xiàn)

@Override
  public String[] selectImports(AnnotationMetadata annotationMetadata) {
    if (!isEnabled(annotationMetadata)) {
      return NO_IMPORTS;
    }
    try {
      //1、 自動配置的元數(shù)據(jù) spring-autocomfigure-metadata.properties
      // 自動配置的開啟條件
      AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
          .loadMetadata(this.beanClassLoader);
      AnnotationAttributes attributes = getAttributes(annotationMetadata);
      // 獲取設置的自動配置列表 spring.factories
      List<String> configurations = getCandidateConfigurations(annotationMetadata,
          attributes);
      configurations = removeDuplicates(configurations);
      configurations = sort(configurations, autoConfigurationMetadata);
      // 獲取要排除的自動配置列表,可以通過 注解@EnableAutoConfiguration 的exclude和
       // 配置文件設置 spring.autoconfigure.exclude key的值
      Set<String> exclusions = getExclusions(annotationMetadata, attributes);
      checkExcludedClasses(configurations, exclusions);
      configurations.removeAll(exclusions);
       // 通過 spring-autocomfigure-metadata.properties ConditionOnClass 條件進行過濾
      configurations = filter(configurations, autoConfigurationMetadata);
      fireAutoConfigurationImportEvents(configurations, exclusions);
      return configurations.toArray(new String[configurations.size()]);
    }
    catch (IOException ex) {
      throw new IllegalStateException(ex);
    }
  }

看下 spring.factories 文件

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

再看下 spring framework中 ConfigurationClassParser 的處理方式,會解析 @Import 里的接口 ImportSelector 返回的所有配置類,那是怎么配置的呢,如 JpaRepositoriesAutoConfiguration

@Configuration
@ConditionalOnBean(DataSource.class)
@ConditionalOnClass(JpaRepository.class)
@ConditionalOnMissingBean({ JpaRepositoryFactoryBean.class,
    JpaRepositoryConfigExtension.class })
@ConditionalOnProperty(prefix = "spring.data.jpa.repositories", name = "enabled", havingValue = "true", matchIfMissing = true)
@Import(JpaRepositoriesAutoConfigureRegistrar.class)
@AutoConfigureAfter(HibernateJpaAutoConfiguration.class)
public class JpaRepositoriesAutoConfiguration {

}

從上面可以看到,有很多的@ConditionalOn**的注解,我們來看下 ConditionEvaluator這個 條件計算器,會去計算出當前這個配置類 是否要開啟,而這些 @ConditionalOn** 是依賴于 @Conditional 這個注解,如  @ConditionalOnBean 最終是通過 Condition 接口來作條件選擇

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnBeanCondition.class)
public @interface ConditionalOnBean {

  /**
   * The class type of bean that should be checked. The condition matches when any of
   * the classes specified is contained in the {@link ApplicationContext}.
   * @return the class types of beans to check
   */
  Class<?>[] value() default {};

  /**
   * The class type names of bean that should be checked. The condition matches when any
   * of the classes specified is contained in the {@link ApplicationContext}.
   * @return the class type names of beans to check
   */
  String[] type() default {};

  /**
   * The annotation type decorating a bean that should be checked. The condition matches
   * when any of the annotations specified is defined on a bean in the
   * {@link ApplicationContext}.
   * @return the class-level annotation types to check
   */
  Class<? extends Annotation>[] annotation() default {};

  /**
   * The names of beans to check. The condition matches when any of the bean names
   * specified is contained in the {@link ApplicationContext}.
   * @return the name of beans to check
   */
  String[] name() default {};

  /**
   * Strategy to decide if the application context hierarchy (parent contexts) should be
   * considered.
   * @return the search strategy
   */
  SearchStrategy search() default SearchStrategy.ALL;

}

Spring boot 的autoconfigure 是囊括了所有可以和spring 整合的項目,但大部分情況下,并不是所以的項目都會啟用,通過 Condition和@Conditional 來判斷條件

  1. 判斷classPath 是否存在指定的類  @ConditionalOnClass
  2. 判斷 ApplicationContext 中是否存在指定的 Bean  @ConditionalOnBean
  3. 配置環(huán)境中是否存在特定的配置項  @ConditionalOnProperty
  4. 配置環(huán)境中指定的配置項是否存在指定的值

禁用配置

當前 也是可以禁用某些我們不想要的默認配置,如上面加載時說到,會排除一些配置(exclude)

  1. 設置 @EnableAutoConfiguration 的exclude 配置
  2. 在配置文件增加 spring.autoconfigure.exclude 配置

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Spring Data JPA 簡單查詢--方法定義規(guī)則(詳解)

    Spring Data JPA 簡單查詢--方法定義規(guī)則(詳解)

    下面小編就為大家?guī)硪黄猄pring Data JPA 簡單查詢--方法定義規(guī)則(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • 使用SpringBoot代碼詳細解釋<List>的用法

    使用SpringBoot代碼詳細解釋<List>的用法

    List是Java集合框架中的一種數(shù)據(jù)結構,用于存儲一組有序的元素,使用List可以方便地向其中添加、刪除或者修改元素,也可以通過下標或者迭代器遍歷其中的元素,這篇文章主要介紹了用SpringBoot代碼詳細解釋<List>的用法,需要的朋友可以參考下
    2023-09-09
  • Java日常練習題,每天進步一點點(14)

    Java日常練習題,每天進步一點點(14)

    下面小編就為大家?guī)硪黄狫ava基礎的幾道練習題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • java實現(xiàn)表格tr拖動的實例(分享)

    java實現(xiàn)表格tr拖動的實例(分享)

    下面小編就為大家分享一篇java實現(xiàn)表格tr拖動的實例。具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Spring計時器StopWatch的具體使用

    Spring計時器StopWatch的具體使用

    本文主要介紹了Spring計時器StopWatch的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • SpringBoot集成Kafka 配置工具類的詳細代碼

    SpringBoot集成Kafka 配置工具類的詳細代碼

    spring-kafka 是基于 java版的 kafka client與spring的集成,提供了 KafkaTemplate,封裝了各種方法,方便操作,它封裝了apache的kafka-client,不需要再導入client依賴,這篇文章主要介紹了SpringBoot集成Kafka 配置工具類,需要的朋友可以參考下
    2022-09-09
  • ArrayList源碼探秘之Java動態(tài)數(shù)組的實現(xiàn)

    ArrayList源碼探秘之Java動態(tài)數(shù)組的實現(xiàn)

    這篇文章將帶大家從ArrayList源碼來探秘一下Java動態(tài)數(shù)組的實現(xiàn),文中的示例代碼講解詳細,對我們深入了解JavaScript有一定的幫助,需要的可以參考一下
    2023-08-08
  • Java設計模式之工廠模式分析【簡單工廠、工廠方法、抽象工廠】

    Java設計模式之工廠模式分析【簡單工廠、工廠方法、抽象工廠】

    這篇文章主要介紹了Java設計模式之工廠模式,結合實例形式分析了簡單工廠、工廠方法、抽象工廠等相關功能、實現(xiàn)與使用方法,需要的朋友可以參考下
    2018-04-04
  • 詳解Java8 新特性之日期API

    詳解Java8 新特性之日期API

    Java 8 在包java.time下包含了一組全新的時間日期API。下面通過示例給大家講解java8 新特征日期api的相關知識,感興趣的朋友一起看看吧
    2017-07-07
  • 注解、原生Spring、SchemaBased三種方式實現(xiàn)AOP代碼案例

    注解、原生Spring、SchemaBased三種方式實現(xiàn)AOP代碼案例

    這篇文章主要介紹了注解、原生Spring、SchemaBased三種方式實現(xiàn)AOP的方法介紹,文中有詳細的代碼示例,對我們的學習有一定的幫助,需要的朋友可以參考下
    2023-06-06

最新評論