ImportBeanDefinitionRegistarの使い方
9519 ワード
Spring公式は、ImportBenDefinitionRegistarを通じて@Component、@Serviceなどの注釈を動的に注入する仕組みを実現しました.
多くの三方枠がSpringに統合されている場合、このインターフェースを通じて指定されたクラスをスキャンして、スプリング容器に登録します.例えばMybatisのMapperインターフェース、springCloudのFeign Clientインターフェースは、このインターフェースを通じて実現されるカスタム登録ロジックです.
このインターフェースを実現したクラスは全部CofigrationClass PostProcessorによって処理されます.CofigrationClass PostProcessorはビーンFactory PostProcessorインターフェースを実現します.だからImportBenDefinitionRegistrarに動的に登録されたbeanは優先的にそのbean初期化します.
基本ステップ:ImportBenDefinitionRegistrarインターフェースを実現する;register BeanDefinitionsを通じて具体的なクラス初期化を実現します.@Configrationの注釈の配置類に@Importを使って実現類を導入します.
簡単な例ここでは、@Mapperの注釈をカスタマイズし、@Componentのような機能を実現します.@Mapperの注釈を追加したクラスは自動的にspring容器にロードされます.
まず@Mapperコメントを作成します.
Mapper BeanDefinitionScannerの実現は以下の通りです.
上記の定義が完了したら、最後の導入操作を行います.自動配置クラスMapper AutoConfigを作成し、@Importを通じてカスタムRegistarを導入します.
多くの三方枠がSpringに統合されている場合、このインターフェースを通じて指定されたクラスをスキャンして、スプリング容器に登録します.例えばMybatisのMapperインターフェース、springCloudのFeign Clientインターフェースは、このインターフェースを通じて実現されるカスタム登録ロジックです.
このインターフェースを実現したクラスは全部CofigrationClass PostProcessorによって処理されます.CofigrationClass PostProcessorはビーンFactory PostProcessorインターフェースを実現します.だからImportBenDefinitionRegistrarに動的に登録されたbeanは優先的にそのbean初期化します.
基本ステップ:ImportBenDefinitionRegistrarインターフェースを実現する;register BeanDefinitionsを通じて具体的なクラス初期化を実現します.@Configrationの注釈の配置類に@Importを使って実現類を導入します.
簡単な例ここでは、@Mapperの注釈をカスタマイズし、@Componentのような機能を実現します.@Mapperの注釈を追加したクラスは自動的にspring容器にロードされます.
まず@Mapperコメントを作成します.
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({
ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
public @interface Mapper {
}
UserMapper類を作成し、@Mapper注を使用します.@Mapper
public class UserMapper {
}
ImportBeanDefinitionRegistarの実現タイプMapper AutoConfigregistarを定義します.Springのいくつかのデータを取得する必要があれば、いくつかのAwareインターフェースを実現できます.これはResource Loader Awareを実現しました.public class MapperAutoConfigureRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware {
private ResourceLoader resourceLoader;
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
MapperBeanDefinitionScanner scanner = new MapperBeanDefinitionScanner(registry, false);
scanner.setResourceLoader(resourceLoader);
scanner.registerFilters();
scanner.addIncludeFilter(new AnnotationTypeFilter(Mapper.class));
scanner.doScan("com.secbro2.learn.mapper");
}
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
}
上記のコードでは、Resource Loader AwareインターフェースのsetsResource Loader方法によりResource Loaderオブジェクトを獲得した.register BeanDefinitions方法では、登録が必要なBeanを、Class PathBeanDefinitionScanner類の実装クラスを介してスキャンして取得します.Mapper BeanDefinitionScannerの実現は以下の通りです.
public class MapperBeanDefinitionScanner extends ClassPathBeanDefinitionScanner {
public MapperBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters) {
super(registry, useDefaultFilters);
}
protected void registerFilters() {
addIncludeFilter(new AnnotationTypeFilter(Mapper.class));
}
@Override
protected Set<BeanDefinitionHolder> doScan(String... basePackages) {
return super.doScan(basePackages);
}
}
Mapper BeanDefinitionScanner継承子Class PathBeanDefinitionScannerは、@Mapperの注釈されたクラスをスキャンします.MapperBeanDefinitionScannerでは、Mapperを含むAnnotationTypeFilterとしてaddInclude Filter方法を指定しています.もちろん、exclude Filtersではロードしないタイプを指定することもできます.この2つの方法は彼らの親クラスClass PathScannenddateComponentProviderによって提供されます.上記の定義が完了したら、最後の導入操作を行います.自動配置クラスMapper AutoConfigを作成し、@Importを通じてカスタムRegistarを導入します.
@Configuration
@Import(MapperAutoConfigureRegistrar.class)
public class MapperAutoConfig {
}