spring动态注入bean

使用的 registerSingleton 方法

public void registerBean(String name, Object obj) {

	// 获取BeanFactory
	DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) ctx
			.getAutowireCapableBeanFactory();

	// 动态注册bean.
	defaultListableBeanFactory.registerSingleton(name, obj);
}

另外一种

ApplicationContext ac = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext());  
ConfigurableApplicationContext context = (ConfigurableApplicationContext) ac;   
//Bean的实例工厂  
DefaultListableBeanFactory dbf = (DefaultListableBeanFactory) context.getBeanFactory();  
//Bean构建  BeanService.class 要创建的Bean的Class对象  
BeanDefinitionBuilder dataSourceBuider = BeanDefinitionBuilder. genericBeanDefinition(BeanService.class);  
//向里面的属性注入值,提供get set方法  
dataSourceBuider.addPropertyValue("msg", "hello ");  
//dataSourceBuider.setParentName("");  同配置 parent  
//dataSourceBuider.setScope("");   同配置 scope  
//将实例注册spring容器中   bs 等同于  id配置  
dbf.registerBeanDefinition("bs", dataSourceBuider.getBeanDefinition());  

注要使用刚注册的 必须通过 getBean("xx")的方式 。这种方式还多用于在过滤器中获取容器对象,因为spring不能为过滤器注入任何属性

另外一种方法

public void registerBean2(String name, Class<?> beanClass) {
	// 获取BeanFactory
	DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) ctx
			.getAutowireCapableBeanFactory();

	// 创建bean信息.
	BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(beanClass);

	// beanDefinitionBuilder.addPropertyValue("name","张三");

	// 动态注册bean.
	defaultListableBeanFactory.registerBeanDefinition(name, beanDefinitionBuilder.getBeanDefinition());
}