好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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://HdhCmsTestcnblogs测试数据/leihuazhe/p/8137564.html

查看更多关于Spring运行时动态注册bean的方法的详细内容...

  阅读:100次