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