在实际业务场景中,因为需要使用到动态注入bean的功能,在网上找了下,代码挺多的,根据我在项目中的使用,整理一下,方便下次使用。
首先需要获取spring的上下文,我这儿是通过实现ApplicationContextAware接口。
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* spring容器上下文
*/
@Component
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtil.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext () {
return applicationContext;
}
//通过名字获取上下文中的bean
public static Object getBean(String name){
return applicationContext.getBean(name);
}
//通过类型获取上下文中的bean
public static Object getBean(Class<?> requiredType){
return applicationContext.getBean(requiredType);
}
}
获取ioc容器注册管理类DefaultListableBeanFactory
ApplicationContext applicationContext = SpringContextUtil.getApplicationContext();
DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();
创建bean并注入到ioc容器中
BeanDefinitionBuilder beanDefinitionBuilderTest = BeanDefinitionBuilder.genericBeanDefinition(HikariDataSource.class, () -> {
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl("");
dataSource.setDriverClassName(DRIVER_CLASS_NAME);
dataSource.setUsername("");
dataSource.setPassword("");
return dataSource;
});
defaultListableBeanFactory.registerBeanDefinition("testDataSource", beanDefinitionBuilderTest.getBeanDefinition());
动态获取bean
HikariDataSource testDataSource = (HikariDataSource) SpringContextUtil.getBean("testDataSource");
请多指点!