在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