ImportBeanDefinitionRegistrar灵活装载Bean

FeignClientsRegistrar实现了ImportBeanDefinitionRegistrar,它是一个动态注入bean的接口,Spring Boot启动的时候,会去调用这个类中的registerBeanDefinitions来实现动态Bean的装载。
它的作用类似于ImportSelector。

class FeignClientsRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware, EnvironmentAware {
      @Override
      public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
            registerDefaultConfiguration(metadata, registry);
            registerFeignClients(metadata, registry);
      }
}

ImportBeanDefinitionRegistrar的作用

  • 定义一个需要被装载到IOC容器中的类HelloService
public class HelloService {

}
  • 定义一个Registrar的实现,定义一个bean,装载到IOC容器
public class AutoLoadBean implements ImportBeanDefinitionRegistrar {

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {
        BeanDefinition beanDefinition = new GenericBeanDefinition();
        beanDefinition.setBeanClassName(HelloService.class.getName());
        registry.registerBeanDefinition("helloService", beanDefinition);
    }
}
  • 定义一个注解类
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(AutoLoadBean.class)
public @interface EnableLoadBean {

}
  • 测试类
@Configuration
@EnableLoadBean
public class TestLoadBean {

    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(TestLoadBean.class);
        System.out.println(applicationContext.getBean(HelloService.class));
    }
}
原文地址:https://www.cnblogs.com/snail-gao/p/14096104.html