服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Spring运行时动态注册bean的方法

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

2021-05-23 15:44枫叶maple Java教程

这篇文章主要介绍了Spring运行时动态注册bean的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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

定义一个没有被spring管理的controller

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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上下文的工具类,如下

工具类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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上下文,代码如下:

?
1
2
3
4
5
6
7
8
@springbootapplication
public class helloapplication {
 
  public static void main(string[] args) {
    applicationcontext app = springapplication.run(helloapplication.class, args);
    springcontextutil.setapplicationcontext(app);
  
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@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

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

原文链接:https://www.cnblogs.com/leihuazhe/p/8137564.html

延伸 · 阅读

精彩推荐