在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