• 注解ImportBeanDefinitionRegistrar ImportSelector


     

    ImportBeanDefinitionRegistrar动态注册bean

    https://blog.csdn.net/jiachunchun/article/details/94569246

    SpringBoot2 | BeanDefinition 注册核心类 ImportBeanDefinitionRegistrar 源码分析 (十)

    https://blog.csdn.net/woshilijiuyi/article/details/85268659

    Spring(32)——ImportSelector介绍

    https://blog.csdn.net/elim168/article/details/88131614

    ImportSelector与DeferredImportSelector的区别(spring4)

    https://blog.csdn.net/boling_cavalry/article/details/82555352

    详解Spring的ImportSelector接口(2)

    https://www.jianshu.com/p/23d4e853b15b

    package com.beanDefinition;
    
    import com.beanDefinition.test.MapperBeanDefinitionRegistrar;
    import com.beanDefinition.test.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Import;
    
    @SpringBootApplication
    @MapperScan("com.beanDefinition.test.mapper")
    @Import(MapperBeanDefinitionRegistrar.class)
    public class TestSpringBootApplication {
      public static void main(String[] args) {
        SpringApplication.run(TestSpringBootApplication.class);
      }
    }
    package com.beanDefinition.test;
    
    import java.util.Map;
    import org.springframework.beans.factory.support.BeanDefinitionRegistry;
    import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;
    import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
    import org.springframework.core.type.AnnotationMetadata;
    import org.springframework.core.type.filter.AnnotationTypeFilter;
    
    public class MapperBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    
      @Override
      public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
          BeanDefinitionRegistry registry) {
        Map<String, Object> map = importingClassMetadata.getAnnotationAttributes(MapperScan.class.getName());
        String scanPackage = (String) map.get("value");
        ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(registry, false);
        scanner.addIncludeFilter(new AnnotationTypeFilter(Mapper.class));
        scanner.scan(scanPackage);
    
      }
    }
    package com.beanDefinition.test;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    public @interface MapperScan {
    
      String value();
    }
    package com.beanDefinition.test;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    public @interface Mapper {
    }
    package com.beanDefinition.test.mapper;
    
    import com.beanDefinition.test.Mapper;
    
    @Mapper
    public class TestMapper {
    
      static{
        System.out.println("hello");
      }
    }
    package com.beanDefinition.test.mapper;
    
    import com.beanDefinition.test.Mapper;
    
    @Mapper
    public class TestMapper2 {
    
      static{
        System.out.println("hello2");
      }
    }
    package com.beanDefinition.registrar;
    
    import org.springframework.beans.factory.config.BeanDefinition;
    import org.springframework.beans.factory.support.BeanDefinitionRegistry;
    import org.springframework.beans.factory.support.GenericBeanDefinition;
    import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
    import org.springframework.core.type.AnnotationMetadata;
    
    /**
     * Created by zhangshukang.
     *
     * 简单用法,手动注册 BeanDefinition
     *
     */
    public class MyAutoBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    
        @Override
        public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
    
            //手动创建 BeanDefinition
            BeanDefinition beanDefinition = new GenericBeanDefinition();
            beanDefinition.setBeanClassName("com.beanDefinition.registrar.component.RegistrarComponent");
            registry.registerBeanDefinition("registrarComponent",beanDefinition);
    
        }
    }
    package com.beanDefinition.registrar;
    
    import com.beanDefinition.registrar.component.RegistrarComponent;
    import org.springframework.beans.factory.config.BeanDefinition;
    import org.springframework.beans.factory.support.BeanDefinitionRegistry;
    import org.springframework.beans.factory.support.BeanNameGenerator;
    import org.springframework.beans.factory.support.GenericBeanDefinition;
    import org.springframework.context.annotation.AnnotationBeanNameGenerator;
    import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
    import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
    import org.springframework.core.type.AnnotationMetadata;
    import org.springframework.core.type.filter.AssignableTypeFilter;
    
    import java.awt.*;
    import java.util.Set;
    
    /**
     * Created by zhangshukang.
     *
     * 自动注册,通过扫描包路径,获取 BeanDefinition
     *
     */
    public class MyAutoBeanDefinitionRegistrar2 implements ImportBeanDefinitionRegistrar {
    
        @Override
        public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
    
            ClassPathScanningCandidateComponentProvider scan = new ClassPathScanningCandidateComponentProvider(false);
            //指定扫描的类型
            scan.addIncludeFilter(new AssignableTypeFilter(RegistrarComponent.class));
            Set<BeanDefinition> candidateComponents = scan.findCandidateComponents("com.beanDefinition.registrar.component");
    
            BeanNameGenerator beanNameGenerator = new AnnotationBeanNameGenerator();
    
            candidateComponents.stream().forEach(beanDefinition->{
    
                String beanName = beanNameGenerator.generateBeanName(beanDefinition, registry);
                if (!registry.containsBeanDefinition(beanDefinition.getBeanClassName())) {
                    registry.registerBeanDefinition(beanName,beanDefinition);
                }
            });
        }
    }

     

  • 相关阅读:
    Nim教程【八】(博客园撰写工具客户端更新)
    图解 MongoDB 地理位置索引的实现原理(转)
    MongoDB学习笔记(索引)(转)
    Hadoop集群WordCount运行详解(转)
    java操作mongodb(连接池)(转)
    面向对象设计七大原则(转)
    Spring中IOC和AOP的详细解释(转)
    java单例模式使用及注意事项
    java.io包的总体框架图(转)
    Java常见异常(Runtime Exception )小结(转)
  • 原文地址:https://www.cnblogs.com/tonggc1668/p/11693839.html
Copyright © 2020-2023  润新知