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のサポートを開始します.
これらの注釈の実装を確認すると、各注釈に@Import注釈があることがわかります.@Import注記は4.2まではインポート構成クラスのみをサポートし、4.2,@Import注記では通常のjavaクラスのインポートをサポートし、beanとして宣言します.これは、自動オープンの実装が、実際にはいくつかの構成クラスをインポートしていることを示しています.
まず@EnableCachingは@Import 1つのCachingConfigurationSelectorクラス を必要とする CachingConfigurationSelectorはまたAdviceModeImportSelector を継承する AdviceModeImportSelectorはまたImportSelector を実現した.すべて、@Enableモジュールを1つとしてカスタマイズする場合、ImportSelectorの実装クラス が必要です.
構成クラスに定義
注記を使用するには、@Importに構成クラスをインポートする必要があります.
テスト時にTestApplicationクラスとMyConfigurationクラスを別のパッケージの下に置くか、@SpringBootApplicationを使用せずに@Configuration+@EnableAutoConfigurationを使用します.
@SpringBootApplication=@Configuration+@EnableAutoConfiguration+@ComponentScan.スキャンパッケージの範囲は、サードパーティ製jarパッケージを除く起動クラスが存在するパッケージとサブパッケージです.maven依存によって追加されたjarをスキャンする必要がある場合は、@ComponentScan注記を使用してサードパーティ製パッケージを単独でスキャンします.
クラスの構成
ImportSelectorのインプリメンテーションクラスをカスタマイズします.
カスタム@Enable
テスト実行順まず、EnableTestBootstrapが起動し、@EnableMyConfig注記に従ってMyImportSelectorクラスを見つけ、selectImportsメソッドを見つけて、「test」beanのロード操作を行います. この実装方式を比較すると、beanをロードする間にいくつかの操作を行うことができ、注釈実装方式に対して比較的自由であり、プログラミング実装方式にはいくつかの弾性操作があることができる.
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;
}
}
.....
}
カスタム@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);
}
}