【README】
1.采用 ImportBeanDefinitionRegistrar 动态注册bean,应用场景有:
如 一个后端服务需要用到多个 rabbitmq集群客户端,kafka客户端;这时就需要手动注册多个同类型的bean,但不同beanName,并用 @Resource(name="beanName") (或@Autowire+@Qualifier)来引入bean;
2.在封装后台框架时,经常会注册同类型的多个bean,因此 ImportBeanDefinitionRegistrar 特别有用;
3.本文代码转自
【例】使用 ImportBeanDefinitionRegistrar 动态注册bean
public class MyBeanRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public 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 {
@Bean
ClientBean clientBean () {
return new ClientBean();
}
}
使用动态注册的bean, AppBean
public class ClientBean {
@Autowired
private 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