[A]自動的にこれらの詳細を設定するには、ソースコードが分からない、あなたはspringbootう言っていません

春に関してのスプリングブーツは、非常に重要な機能が自動設定され、構成が慣例階イデオロギー的な成功よりも大きくなります。箱から出してガイドのシリーズの可能XXX-春ブート・スターター、または(初心者担当者用)、最小限の設定が必要です行っているデフォルトの自動コンフィギュレーションからです。

設定を変更するためのアクセスを提供しながら自動設定は、最初にいくつかの設定を初期化します。

全体の構造

spring-boot-autoconfigureパッケージは、spring-boot-starter非常に重要な自動設定機能を提供し、パッケージも、一般的に依存して、デフォルトの設定セット。

頼ります

これは、3つのパッケージに依存します。

  • ベースパッケージ:春ブーツ
  • オプション機能の依存関係:実際に使用する際の依存性は、ユーザーが提供する共通のデフォルト設定を提供します
  • テストパッケージ

オプション機能の依存関係は、ばねデータのRedis、バリ、thymeleaf、同様のWebSocketを持っています。以下は、例として、いくつかを選択し、特定のを説明します。

原則

@EnableAutoConfiguration

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
  /**
   *  当此名对应属性为 true 时,才开启自动配置
   */
  String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
  
  /**
   *  需要排除的类(通常当此类在类路径下时使用)
   */
  Class<?>[] exclude() default {};

  /**
   *  需要排除的类名(当此类不在类路径下时使用)
   */
  String[] excludeName() default {};
}

@AutoConfigurationPackage

注釈このタイプのパケットを使用すると、登録された春のBeanに属します。
beanNameのこの春のBeanはAutoConfigurationPackages、ある
BasePackagesにたbeanClass。

AutoConfigurationImportSelector

自動構成選択のセレクタ自動設定、どのようなタイプ。

selectImports

コアの方法:String[] selectImports(AnnotationMetadata annotationMetadata)この方法で自動的に設定される完全なクラス名の配列を返します。
クラスは、自動設定は、以下の条件を満たしている必要があります。

  1. META-INF / spring.factoriesキーであるorg.springframework.boot.autoconfigure.EnableAutoConfigurationクラス
  2. 注釈を除外@EnableAutoConfiguration、excludeNameクラス属性はspring.autoconfigure.excludeクラスコンフィギュレーションセットを表現(存在する場合クラスパスが、ステップ1に存在しない場合、例外がスロー)
  3. 条件を満たした3つの注釈が含まれていますOnBeanCondition(例:ConditionalOnBean、ConditionalOnMissingBean)、 OnClassCondition例えば:ConditionalOnClass、ConditionalOnMissingClass)、 OnWebApplicationCondition例えば:ConditionalOnWebApplication、ConditionalOnNotWebApplication)

最後に、それがアクティブになりAutoConfigurationImportEvent、イベントを。

getImportGroupとDeferredImportSelector.Group

異なるグループ化ImportSelectorからの結果

自動コンフィギュレーションシーケンス

  • AutoConfigurationSorter
  • @AutoConfigureOrder
  • @AutoConfigureBefore
  • @AutoConfigureAfter

AutoConfigurationSorter具体的なシーケンス制御ロジックが
@AutoConfigureOrderあり@Order、カスタム設定順序を使用することができます開発する必要がある、特定のバリアント自動設定で@AutoConfigureOrderクラス制御アプリケーション構成绝对顺序
@AutoConfigureBeforeそして、@AutoConfigureAfterシーケンシャルアプリケーションクラスの相対的な構成を制御します。

具体的なトレーニング・シーケンスは次のよう:

  1. クラス名による字母表递增ソート
  2. @AutoConfigureOrder値(デフォルト:0)递增並び替え
  3. よる@AutoConfigureBeforeと、@AutoConfigureAfter順序を調整します

あなたは@Order、自動的にそれのように構成された順序を制御することができますか?

@SpringBootApplication

2.1.8.RELEASE 次のようにバージョンは、ノートのこの組み合わせは、ノート:

// 省略不需关心的注解
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {

元はされてきた@Configuration変更@SpringBootConfigurationは次のようにその意味は、:

  • 同等クラス@Configuration
  • 注釈クラスが春ブートアプリケーションを提供して使用してください。
    アプリケーションが一つだけ@SpringBootConfigurationクラスを含めることができ、それは通常@SpringBootApplication

AbstractDependsOnBeanFactoryPostProcessor

このクラスはBeanFactoryPostProcessor、春ブート起動に適切なタイミングで実行されます実装
豆に依存豆の種類を指定する必要があり、ダイナミックな決定を構築することにより、このクラスから継承します。

BackgroundPreinitializer

このクラスは、実装ApplicationListener<SpringApplicationEvent>
など、バックグラウンドスレッドの時間のかかる作業で、早期初期化をトリガー::などの機能を
ValidationInitializerMessageConverterInitializerJacksonInitializerCharsetInitializerConversionServiceInitializerMBeanFactoryInitializer、など

@ImportAutoConfiguration

自動インポートの設定クラス。ビューのソース点から、自動的にテスト時間を設定するために使用されます。また、注釈の使用、META-INF/spring.factories例えば構成で、:

@ImportAutoConfiguration
public @interface AutoConfigureDataJpa {}
org.springframework.boot.test.autoconfigure.orm.jpa.AutoConfigureDataJpa=\
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration

したがって注釈の使用はAutoConfigureDataJpaJpaRepositoriesAutoConfiguration、DataSourceAutoConfiguration他のカテゴリを導入することと等価です。

次のように使用します。

@BootstrapWith(DataJpaTestContextBootstrapper.class)
@ExtendWith(SpringExtension.class)
@OverrideAutoConfiguration(enabled = false)
@TypeExcludeFilters(DataJpaTypeExcludeFilter.class)
@Transactional
@AutoConfigureCache
@AutoConfigureDataJpa
@AutoConfigureTestDatabase
@AutoConfigureTestEntityManager
@ImportAutoConfiguration
public @interface DataJpaTest {
  // ...
}
@RunWith(SpringRunner.class)
@DataJpaTest
@TestPropertySource(properties = "spring.jpa.hibernate.use-new-id-generator-mappings=false")
public class DataJpaTestIntegrationTests {

    @Autowired
    private TestEntityManager entities;

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Autowired
    private ExampleRepository repository;

    @Autowired
    private DataSource dataSource;

    @Autowired
    private ApplicationContext applicationContext;

    @Test
    public void testEntityManager() {
        ExampleEntity entity = this.entities.persist(new ExampleEntity("spring", "123"));
        this.entities.flush();
        Object id = this.entities.getId(entity);
        ExampleEntity found = this.entities.find(ExampleEntity.class, id);
        assertThat(found.getName()).isEqualTo("spring");
    }
    
    // ...

一般的に使用されるツールのサポート

実際の使用において、任意の(または非常に少ない)構成せずにコンテンツの多くは、一方で、直接使用することができる場合原理は各XXX-ばねブートスタータスプリングboot-を含有する上記提供自動設定の礎石であるが、自動設定と自動コンフィギュレーションロジックを書いて、一方では、春・ブート・自動構成パッケージの春ブート公式直接サポートしています。
一般的に使用されるツールの春ブートサポート
共通のデータ・ソース用のスプリング・ブートをサポート

例:gson自動設定

次のカテゴリをサポートしています:

  • GsonProperties
  • GsonBuilderCustomizer
  • GsonAutoConfiguration

GsonPropertiesクラスゲットGson構成プロパティを

@ConfigurationProperties(prefix = "spring.gson")
public class GsonProperties {
  private Boolean generateNonExecutableJson;
  private Boolean excludeFieldsWithoutExposeAnnotation;
  private Boolean serializeNulls;
  private String dateFormat;
  // ...
}
@FunctionalInterface
public interface GsonBuilderCustomizer {
    /**
     * 自定义 GsonBuilder
     */
    void customize(GsonBuilder gsonBuilder);
}

GsonAutoConfiguration GsonPropertiesとGsonBuilderCustomizer(内部クラス)を使用して、

@Configuration
@ConditionalOnClass(Gson.class)
@EnableConfigurationProperties(GsonProperties.class)
public class GsonAutoConfiguration {
    @Bean
    @ConditionalOnMissingBean
    public GsonBuilder gsonBuilder(List<GsonBuilderCustomizer> customizers) {
        GsonBuilder builder = new GsonBuilder();
        customizers.forEach((c) -> c.customize(builder));
        return builder;
    }

    @Bean
    @ConditionalOnMissingBean
    public Gson gson(GsonBuilder gsonBuilder) {
        return gsonBuilder.create();
    }

    @Bean
    public StandardGsonBuilderCustomizer standardGsonBuilderCustomizer(GsonProperties gsonProperties) {
        return new StandardGsonBuilderCustomizer(gsonProperties);
    }

    static final class StandardGsonBuilderCustomizer implements GsonBuilderCustomizer, Ordered {

        private final GsonProperties properties;

        StandardGsonBuilderCustomizer(GsonProperties properties) {
            this.properties = properties;
        }

        @Override
        public int getOrder() {
            return 0;
        }

        @Override
        public void customize(GsonBuilder builder) {
         // ...
        }

公開番号:イーフェイは(Javaドメインの知識に焦点を当て、是非における綿密な研究システムの原則にソースからと秩序の学習)

イーフェイは、是非します

おすすめ

転載: www.cnblogs.com/lw5946/p/11689890.html