ImportBeanDefinitionRegistarの使い方


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コメントを作成します.
@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 {
     
}