什么場景下,需要主動向spring容器注冊bean呢?
如我之前做個的一個支持掃表的基礎平臺,使用者只需要添加基礎配置 + groovy任務,就可以丟到這個平臺上面來運行了,而這個基礎平臺是一直都在運行的,所以在新來任務時,最直觀需要注冊的就是 datasource
數據源這個bean了,那么可以怎么玩?
i. 主動注冊bean支持
借助beandefinition來實現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); } } |
輸出如下
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://segmentfault.com/a/1190000015887070