注解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);
            }
        });
    }
}

 

原文地址:https://www.cnblogs.com/tonggc1668/p/11693839.html