首页 > 开发 > Java > 正文

Spring运行时动态注册bean的方法

2024-07-14 08:41:55
字体:
来源:转载
供稿:网友

在spring运行时,动态的添加bean,dapeng框架在解析xml的字段时,使用到了动态注册,注册了一个实现了FactoryBean类!

定义一个没有被Spring管理的Controller

public class UserController implements InitializingBean{  private UserService userService;  public UserService getUserService() {    return userService;  }  public void setUserService(UserService userService) {    this.userService = userService;  }  @Override  public void afterPropertiesSet() throws Exception {    System.out.println("我是动态注册的你,不是容器启动的时候注册的你");  }  public String toAction(String content){    return "-->" + userService.doService(content);  }}

需要注意的是,如果要注入UserService,需要提供它的getter和setter方法

现在启动springboot工程,显而易见这个类是不会被Spring管理的,接下来我们定义一个获取Spring上下文的工具类,如下

工具类

public class SpringContextUtil {  private static ApplicationContext applicationContext;  //获取上下文  public static ApplicationContext getApplicationContext() {    return applicationContext;  }  //设置上下文  public static void setApplicationContext(ApplicationContext applicationContext) {    SpringContextUtil.applicationContext = applicationContext;  }  //通过名字获取上下文中的bean  public static Object getBean(String name){    return applicationContext.getBean(name);  }  //通过类型获取上下文中的bean  public static Object getBean(Class<?> requiredType){    return applicationContext.getBean(requiredType);  }}

我们在Springboot的启动类中,保存当前Spring上下文,代码如下:

@SpringBootApplicationpublic class HelloApplication {  public static void main(String[] args) {    ApplicationContext app = SpringApplication.run(HelloApplication.class, args);    SpringContextUtil.setApplicationContext(app);  }  }

然后我们在另一个被Spring管理的容器中,写如下方法,进行bean的动态注册

@GetMapping("/bean")public String registerBean() {  //将applicationContext转换为ConfigurableApplicationContext  ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) SpringContextUtil.getApplicationContext();  // 获取bean工厂并转换为DefaultListableBeanFactory  DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) configurableApplicationContext.getBeanFactory();  // 通过BeanDefinitionBuilder创建bean定义  BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(UserController.class);      // 设置属性userService,此属性引用已经定义的bean:userService,这里userService已经被spring容器管理了.  beanDefinitionBuilder.addPropertyReference("userService", "userService");  // 注册bean  defaultListableBeanFactory.registerBeanDefinition("userController", beanDefinitionBuilder.getRawBeanDefinition());  UserController userController = (UserController) SpringContextUtil.getBean("userController");  return userController.toAction("动态注册生成调用");   //删除bean.  //defaultListableBeanFactory.removeBeanDefinition("testService");}

如上,就能动态的注册bean

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VeVb武林网。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表