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