Java笔记··By/蜜汁炒酸奶

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());
1
2
3
4
5
6
7
8
9
10
11
12
13

若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);
    }
1
2
3
4
5
6
7
8
9
10
11
12
预览
Loading comments...
0 条评论

暂无数据

example
预览