Spring动态添加Bean,需要使用到BeanDefinitionRegistryPostProcessor
public class DataSourcesBeanFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor {
private final List<String> customerKeys;
public DataSourcesBeanFactoryPostProcessor(Environment springEnvironment) {
parseCustomerKeys(springEnvironment.getProperty("customerKeys"));
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
for (String customerKey : customerKeys) {
String dataSourceName = "dataSource_" + customerKey;
BeanDefinitionBuilder definitionBuilder =
BeanDefinitionBuilder.genericBeanDefinition(JndiObjectFactoryBean.class);
definitionBuilder.addPropertyValue("jndiName", "jdbc/" + dataSourceName);
registry.registerBeanDefinition(dataSourceName, definitionBuilder.getBeanDefinition());
}
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// we actually only add new beans, but do not post process the existing definitions
}
private static List<String> parseCustomerKeys(String rawCustomerKeys) {
if (StringUtils.isEmpty(rawCustomerKeys)){
throw new IllegalArgumentException("Property 'customerKeys' is undefined.");
}
return Collections.unmodifiableList(Arrays.asList(StringUtils.split(rawCustomerKeys, ",")));
}
}
参考:How to Create Your Own 'Dynamic' Bean Definitions in Spring
如果能拿到ApplicationContext对象,则还可以通过这种方式来注册Bean对象
context.getBeanFactory().registerSingleton(beanName, singletonObject)