SpringBoot 中动态的对Bean对象设置和获取

好记忆不如烂笔头,能记下点东西,就记下点,有时间拿出来看看,也会发觉不一样的感受

目录

前言

bean对象的获取

bean对象的设置


前言


现实中,总会有将bean获取或者动态(程序启动时候,通过参数判断是否需要创建bean对象,并放入到applicationcontext中去)将bean放入到springboot全局中去。

bean对象的获取

bean 对象的获取很容易,只需要在ApplicationContext 中拿取就是了,需要 实现的接口是:ApplicationContextAware

代码如下:
 

@Component
public class BootBeanGetter implements ApplicationContextAware {
	private static ApplicationContext applicationContext;
	
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		setApplicationContextStatic(applicationContext);
	}
	
	public static <T> T getClassBean(Class<T> requiredType) {
		return applicationContext.getBean(requiredType);
	}
	
	public static Object getBean(String name){
		return applicationContext.getBean(name);
	}
	
	public static ApplicationContext getApplicationContext() {
		return applicationContext;
	}
	
	public static void setApplicationContextStatic(final ApplicationContext applicationContext) {
		BootBeanGetter.applicationContext = applicationContext;
	}

}

如此就可以在代码中,使用 BootBeanGetter 来获取bean对象了。

bean对象的设置

那么,如何动态设置bean对象呐,此次的bean对象的动态设置,是指在实现了 CommandLineRunner 等接口情况下,通过动态获取配置,进而动态将获取的信息转换得到的bean(根据条件,可能不存在,即无法创建bean)放入到ApplicationContext 中去,操作如下:

@Component
public class BootBeanSetter implements ApplicationContextAware {
	
	/**
	 * 配置bean实例.
	 */
	private static ConfigurableApplicationContext applicationContext;
	
	public BootBeanSetter(ConfigurableApplicationContext applicationContext) {
		this.applicationContext = applicationContext;
	}
	
	/**
	 * 动态将bean放入
	 * @param name
	 * @param clazz
	 * @param args
	 */
	public static void registerBean(String name, Class clazz, Object... args) {
		BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz);
		if (args.length > 0) {
			for (Object arg : args) {
				beanDefinitionBuilder.addConstructorArgValue(arg);
			}
		}
		BeanDefinition beanDefinition = beanDefinitionBuilder.getRawBeanDefinition();
		BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) applicationContext.getBeanFactory();
		//注册bean对象.
		beanFactory.registerBeanDefinition(name, beanDefinition);
	}
	
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		BootBeanSetter.applicationContext = (ConfigurableApplicationContext) applicationContext;
	}
}

如此操作,可以将动态创建的bean放入到springboot的ApplicationContext 对象中去。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值