spring之動(dòng)態(tài)注冊bean
什么場景下,需要主動(dòng)向spring容器注冊bean呢?
如我之前做個(gè)的一個(gè)支持掃表的基礎(chǔ)平臺(tái),使用者只需要添加基礎(chǔ)配置 + groovy任務(wù),就可以丟到這個(gè)平臺(tái)上面來運(yùn)行了,而這個(gè)基礎(chǔ)平臺(tái)是一直都在運(yùn)行的,所以在新來任務(wù)時(shí),最直觀需要注冊的就是 datasource
數(shù)據(jù)源這個(gè)bean了,那么可以怎么玩?
i. 主動(dòng)注冊bean支持
借助beandefinition來實(shí)現(xiàn)bean的定義,從最終的使用來看,代碼比較少,幾行而已
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public <t> t registerbean(string name, class <t> clazz, object... args) { beandefinitionbuilder beandefinitionbuilder = beandefinitionbuilder.genericbeandefinition(clazz); if (args.length > 0 ) { for (object arg : args) { beandefinitionbuilder.addconstructorargvalue(arg); } } beandefinition beandefinition = beandefinitionbuilder.getrawbeandefinition(); beandefinitionregistry beanfactory = (beandefinitionregistry) applicationcontext.getbeanfactory(); beanfactory.registerbeandefinition(name, beandefinition); return applicationcontext.getbean(name, clazz); } |
測試如下
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
import com.github.hui.story.quickstory.server.visitservice; import lombok.tostring; import org.springframework.beans.factory.annotation.autowired; import org.springframework.beans.factory.config.beandefinition; import org.springframework.beans.factory.support.beandefinitionbuilder; import org.springframework.beans.factory.support.beandefinitionregistry; import org.springframework.context.configurableapplicationcontext; import org.springframework.stereotype.component; @component public class beanholder { private final configurableapplicationcontext applicationcontext; public beanholder(configurableapplicationcontext applicationcontext) { this .applicationcontext = applicationcontext; initser(); } public void initser() { inrser ser = registerbean( "test" , inrser. class ); ser.name = "一灰" ; ser.uid = 22 ; system.out.println(ser); inrser ser2 = registerbean( "test2" , inrser. class , "一灰灰blog" , 20 ); system.out.println(ser2); } @tostring public static class inrser { private string name; private integer uid; @autowired private visitservice visitservice; public inrser() { } public inrser(string name, integer uid) { this .name = name; this .uid = uid; } } private <t> t registerbean(string name, class <t> clazz, object... args) { beandefinitionbuilder beandefinitionbuilder = beandefinitionbuilder.genericbeandefinition(clazz); if (args.length > 0 ) { for (object arg : args) { beandefinitionbuilder.addconstructorargvalue(arg); } } beandefinition beandefinition = beandefinitionbuilder.getrawbeandefinition(); beandefinitionregistry beanfactory = (beandefinitionregistry) applicationcontext.getbeanfactory(); beanfactory.registerbeandefinition(name, beandefinition); return applicationcontext.getbean(name, clazz); } } |
輸出如下
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://segmentfault.com/a/1190000015887070