好记忆不如烂笔头,能记下点东西,就记下点,有时间拿出来看看,也会发觉不一样的感受
目录
前言
现实中,总会有将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 对象中去。