Spring中实现动态注册bean

Spring中实现动态注册bean

使用Spring期间可能会遇上需要动态注册bean的时候,此时可以通过如下实现:

基本步骤

//将applicationContext转换为ConfigurableApplicationContext
ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) applicationContext;
// 获取bean工厂并转换为DefaultListableBeanFactory
DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) configurableApplicationContext.getBeanFactory();
// 通过BeanDefinitionBuilder创建bean定义
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(UserService.class);
// 设置属性userAcctDAO,此属性引用已经定义的bean:userAcctDAO
beanDefinitionBuilder.addPropertyReference("userAcctDAO", "UserAcctDAO");
// 注册bean,第一个参数为BeanName
defaultListableBeanFactory.registerBeanDefinition("sdfds",beanDefinitionBuilder.getRawBeanDefinition());

若BeanName不同将生成新的,若相同则会覆盖原有的。

例子

// 获取applicationContext的方式因项目而异。
private static ApplicationContext applicationContext = SpringUtil.getApplicationContext();
// 获取bean工厂并转换为DefaultListableBeanFactory
private static DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory)applicationContext.getAutowireCapableBeanFactory();
public static LdapTemplate setLdapBeen(LdapSetting ldap) {
String bennName = "ldapTemplate"+ldap.getSite().getId();
BeanDefinitionBuilder beanDefinitionBuilder =BeanDefinitionBuilder.genericBeanDefinition(LdapTemplate.class);
beanDefinitionBuilder.addPropertyValue("contextSource",getLdapContextSource(ldap));
defaultListableBeanFactory.registerBeanDefinition(bennName,beanDefinitionBuilder.getBeanDefinition());
return (LdapTemplate) applicationContext.getBean(bennName);
}
本文采用 CC BY-NC-SA 4.0 许可,转载请注明出处与作者。

支持一下

如果这篇文章对你有帮助,欢迎打赏或分享。

打赏支持

评论