使用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);
}