我是靠谱客的博主 跳跃小天鹅,最近开发中收集的这篇文章主要介绍java远程插件动态注册机制_Spring运行时动态注册bean的方法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在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上下文,代码如下:

@SpringBootApplication

public 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

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

最后

以上就是跳跃小天鹅为你收集整理的java远程插件动态注册机制_Spring运行时动态注册bean的方法的全部内容,希望文章能够帮你解决java远程插件动态注册机制_Spring运行时动态注册bean的方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部