使用Spring期间可能会遇上需要动态注册bean的时候,此时可以通过如下实现:
基本步骤
//将applicationContext转换为ConfigurableApplicationContextConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) applicationContext;
// 获取bean工厂并转换为DefaultListableBeanFactoryDefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) configurableApplicationContext.getBeanFactory();
// 通过BeanDefinitionBuilder创建bean定义BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(UserService.class);// 设置属性userAcctDAO,此属性引用已经定义的bean:userAcctDAObeanDefinitionBuilder.addPropertyReference("userAcctDAO", "UserAcctDAO");
// 注册bean,第一个参数为BeanNamedefaultListableBeanFactory.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); }
评论