Springboot 2(43)カスタマイズ@Enableモジュールの組み立てが簡単

8467 ワード

ソースアドレス
Springboot 2チュートリアルシリーズ
spring-bootフレームワークで@EnableAutoConfiguration自動スキャンアセンブリBeanを開く
インプリメンテーションモード
  • 注記方式
  • プログラミング方式
  • 背景


    SpringBootの学習では、@Enable***注記を使用します.使用上も@Configurationクラス注記のクラスに追加されています.たとえば、(1)@EnableAutoConfiguration自動スキャンアセンブリBeanを開きます.
    (2)@EnableSchedulingオープン計画タスクのサポート
    (3)@E n a b l e TransactionManagement注釈トランザクションのサポートを開始します.
    (4)@EnableCachingコメント式のキャッシュサポートをオンにします.
    (5)@EnableAspectJAutoProxyはAspectJ自動エージェントのサポートを開始し、
    (6)@EnableAsyncオープン非同期メソッドのサポート
    (7)@EnableWebMvcは、Web MVCの構成サポートを開始します.
    (8)@E n a b l e ConfigurationProperties@ConfigurationProperties注記構成Beanのサポートを開始します.
    (9)@EnableJpaRepositories Spring Data JPA Repositoryのサポートを開始します.

    @Enableのソースコードの表示


    これらの注釈の実装を確認すると、各注釈に@Import注釈があることがわかります.@Import注記は4.2まではインポート構成クラスのみをサポートし、4.2,@Import注記では通常のjavaクラスのインポートをサポートし、beanとして宣言します.これは、自動オープンの実装が、実際にはいくつかの構成クラスをインポートしていることを示しています.

    @EnableWebMvcは注記駆動方式を採用

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    @Documented
    @Import(DelegatingWebMvcConfiguration.class)
    public @interface EnableWebMvc {
    } 
    
    

    @EnableCachingインタフェースプログラミング方式を採用

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Import({CachingConfigurationSelector.class})
    public @interface EnableCaching {
        boolean proxyTargetClass() default false;
    
        AdviceMode mode() default AdviceMode.PROXY;
    
        int order() default 2147483647;
    }
    
    
    public class CachingConfigurationSelector extends AdviceModeImportSelector {
    
       ......
       
        public CachingConfigurationSelector() {
        }
    
        public String[] selectImports(AdviceMode adviceMode) {
            switch(adviceMode) {
            case PROXY:
                return this.getProxyImports();
            case ASPECTJ:
                return this.getAspectJImports();
            default:
                return null;
            }
        }
    
       .....
    
    }
    
    
  • まず@EnableCachingは@Import 1つのCachingConfigurationSelectorクラス
  • を必要とする
  • CachingConfigurationSelectorはまたAdviceModeImportSelector
  • を継承する
  • AdviceModeImportSelectorはまたImportSelector
  • を実現した.
  • すべて、@Enableモジュールを1つとしてカスタマイズする場合、ImportSelectorの実装クラス
  • が必要です.

    カスタム@Enableモジュール


    注釈駆動による実装


    構成クラスに定義
    @Configuration
    public class MyConfiguration {
        /**
         *   Bean  
         * @return
         */
        @Bean
        public String test() {
            return " ";
        }
    }
    
    

    注記を使用するには、@Importに構成クラスをインポートする必要があります.
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Import({MyConfiguration.class})
    public @interface EnableMyConfig {
    }
    
    @SpringBootApplication
    @EnableMyConfig
    public class TestApplication {
    
        public static void main(String[] args){
            SpringApplication app = new SpringApplication(TestApplication.class);
            // app.setWebEnvironment(false);
            ConfigurableApplicationContext context =app.run(args);
    
            String test = context.getBean("test",String.class);
            System.out.println("bean --->"+test);
        }
    }
    

    テスト時にTestApplicationクラスとMyConfigurationクラスを別のパッケージの下に置くか、@SpringBootApplicationを使用せずに@Configuration+@EnableAutoConfigurationを使用します.
    @SpringBootApplication=@Configuration+@EnableAutoConfiguration+@ComponentScan.スキャンパッケージの範囲は、サードパーティ製jarパッケージを除く起動クラスが存在するパッケージとサブパッケージです.maven依存によって追加されたjarをスキャンする必要がある場合は、@ComponentScan注記を使用してサードパーティ製パッケージを単独でスキャンします.

    インタフェースベースの駆動実装


    クラスの構成
    public class MyConfiguration2 {
        /**
         *   Bean  
         * @return
         */
        @Bean
        public String test2() {
            return " ";
        }
    }
    

    ImportSelectorのインプリメンテーションクラスをカスタマイズします.
    public class MyImportSelector2 implements ImportSelector {
    
        @Override
        public String[] selectImports(AnnotationMetadata annotationMetadata) {
            //  
            //  MyImportSelector MyConfiguration, MyConfiguration
            return new String[]{MyConfiguration2.class.getName()};
        }
    }
    
    

    カスタム@Enable
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Import({MyImportSelector2.class})
    public @interface EnableMyConfig2 {
    }
    

    テスト
    @Configuration
    @EnableAutoConfiguration
    @EnableMyConfig2
    public class EnableApplication {
    	
    	public static void main(String[] args){
            SpringApplication app = new SpringApplication(EnableApplication.class);
           // app.setWebEnvironment(false);
            ConfigurableApplicationContext context =app.run(args);
    
            String test = context.getBean("test2",String.class);
            System.out.println("bean --->"+test);
        }
    
    }
    
  • 実行順まず、EnableTestBootstrapが起動し、@EnableMyConfig注記に従ってMyImportSelectorクラスを見つけ、selectImportsメソッドを見つけて、「test」beanのロード操作を行います.
  • この実装方式を比較すると、beanをロードする間にいくつかの操作を行うことができ、注釈実装方式に対して比較的自由であり、プログラミング実装方式にはいくつかの弾性操作があることができる.