【README】
1.采用 ImportBeanDefinitionRegistrar 动态注册bean,应用场景有:
如 一个后端服务需要用到多个 rabbitmq集群客户端,kafka客户端;这时就需要手动注册多个同类型的bean,但不同beanName,并用 @Resource(name="beanName") (或@Autowire+@Qualifier)来引入bean;
2.在封装后台框架时,经常会注册同类型的多个bean,因此 ImportBeanDefinitionRegistrar 特别有用;
3.本文代码转自
https://www.logicbig.com/tutorials/spring-framework/spring-core/import-bean-registrar.htmlhttps://www.logicbig.com/tutorials/spring-framework/spring-core/import-bean-registrar.html
【例】使用 ImportBeanDefinitionRegistrar 动态注册bean
public class MyBeanRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions (AnnotationMetadata importingClassMetadata,BeanDefinitionRegistry registry) {GenericBeanDefinition gbd = new GenericBeanDefinition();gbd.setBeanClass(AppBean.class);// 显然,这里是基于反射调用bean的setter方法 gbd.getPropertyValues().addPropertyValue("str", "value set from registrar");registry.registerBeanDefinition("appBean", gbd);}
}
自动装配类
@Configuration
@Import(MyBeanRegistrar.class)
public class MyConfig {@BeanClientBean clientBean () {return new ClientBean();}
}
使用动态注册的bean, AppBean
public class ClientBean {@Autowiredprivate AppBean appBean;public void doSomething () {appBean.process();}
}
AppBean 定义:
public class AppBean {private String str;public void setStr (String str) {this.str = str;}public void process () {System.out.println(str);}
}
测试方法入口:
public class ImportBeanDefinitionRegistrarExample {public static void main (String[] args) {ApplicationContext context =new AnnotationConfigApplicationContext(MyConfig.class);ClientBean bean = context.getBean(ClientBean.class);bean.doSomething();}
}
打印日志:
value set from registrar