zoukankan      html  css  js  c++  java
  • 注解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);
                }
            });
        }
    }

     

  • 相关阅读:
    Console.WriteLine输出字符格式化
    GridView动态生成列问题
    日历控件,可运行在XHTML1.0下
    GridView內容導出Excel時異常:必须置於有 runat=server 的表单标记之中
    圆弧分割
    矩阵变换
    使用group by 来统计的小作业
    group by 后使用 rollup 子句总结
    mysql字符串拼接,存储过程,(来自网上看到)
    【深入理解Linux内核】《第二章 内存寻址》笔记 (2014-06-28 12:38)
  • 原文地址:https://www.cnblogs.com/tonggc1668/p/11693839.html
Copyright © 2011-2022 走看看