激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 200行Java代碼如何實現(xiàn)依賴注入框架詳解

200行Java代碼如何實現(xiàn)依賴注入框架詳解

2021-04-25 13:00老錢 Java教程

依賴注入對大家來說應(yīng)該都不陌生,下面這篇文章主要給大家介紹了關(guān)于利用200行Java代碼如何實現(xiàn)依賴注入框架的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

依賴注入介紹

先回顧下依賴注入的概念:

我們常提起的依賴注入(dependency injection)和控制反轉(zhuǎn)(inversion of control)是同一個概念。具體含義是:當某個角色(可能是一個java實例,調(diào)用者)需要另一個角色(另一個java實例,被調(diào)用者)的協(xié)助時,在 傳統(tǒng)的程序設(shè)計過程中,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實例。但在spring里,創(chuàng)建被調(diào)用者的工作不再由調(diào)用者來完成,因此稱為控制反轉(zhuǎn);創(chuàng)建被調(diào)用者 實例的工作通常由spring容器來完成,然后注入調(diào)用者,因此也稱為依賴注入。

其實簡單的說,依賴注入起到的作用就是講對象之間的依賴關(guān)系從原先的代碼中解耦出來,通過配置文件或注解等方式加上spring框架的處理讓我們對依賴關(guān)系靈活集中的進行管理。

依賴注入框架

依賴注入框架并不神秘,其實它是非常簡單的東西。不要去看spring的依賴注入源碼,因為你只要一去看就意味著你再也寫不敢下手自己擼了,它的功能因為過于強大,所以設(shè)計也過于復(fù)雜,普通程序員一眼看去只能望洋興嘆。

我也并沒有去細致閱讀spring源碼。即便如此也只用了半天的時間便自己擼了一個基本滿足標準依賴注入規(guī)范「jsr-330」的小框架iockids。這個小框架只有一個主類injector,大約200行代碼,它具備以下功能。

  1. 單例/非單例注入
  2. 構(gòu)造器注入
  3. 字段注入
  4. 循環(huán)依賴注入
  5. qualifier注入

我們看一個稍微復(fù)雜一點的使用示例

?
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import javax.inject.inject;
import javax.inject.named;
import javax.inject.singleton;
import iockids.injector;
@singleton
class root {
 @inject
 @named("a")
 node a;
 @inject
 @named("b")
 node b;
 @override
 public string tostring() {
  return string.format("root(%s, %s)", a.name(), b.name());
 }
}
 
interface node {
 string name();
}
 
@singleton
@named("a")
class nodea implements node {
 @inject
 leaf leaf;
 @inject
 @named("b")
 node b;
 @override
 public string name() {
  if (b == null)
   return string.format("nodea(%s)", leaf);
  else
   return string.format("nodeawithb(%s)", leaf);
 }
}
 
@singleton
@named("b")
class nodeb implements node {
 leaf leaf;
 @inject
 @named("a")
 node a;
 @inject
 public nodeb(leaf leaf) {
  this.leaf = leaf;
 }
 
 @override
 public string name() {
  if (a == null)
   return string.format("nodeb(%s)", leaf);
  else
   return string.format("nodebwitha(%s)", leaf);
 }
}
 
class leaf {
 @inject
 root root;
 int index;
 static int sequence;
 public leaf() {
  index = sequence++;
 }
 
 public string tostring() {
  if (root == null)
   return "leaf" + index;
  else
   return "leafwithroot" + index;
 }
 
}
 
public class demo {
 public static void main(string[] args) {
  var injector = new injector();
  injector.registerqualifiedclass(node.class, nodea.class);
  injector.registerqualifiedclass(node.class, nodeb.class);
  var root = injector.getinstance(root.class);
  system.out.println(root);
 }
}

上面這份代碼用到了iockids提供的所有功能。

  1. root/nodea/nodeb類是單例類
  2. leaf類是非單例類
  3. 它們都使用了字段注入
  4. nodeb使用了構(gòu)造器注入
  5. nodea和nodeb還使用了qualifier名稱注入
  6. leaf類中有root類型的字段,這便是循環(huán)依賴
  7. nodea中有nodeb字段,nodeb中有nodea字段,這也是循環(huán)依賴

為了便于理解上述代碼,我畫了依賴圖

200行Java代碼如何實現(xiàn)依賴注入框架詳解

上面的代碼輸出如下

?
1
root(nodeawithb(leafwithroot0), nodebwitha(leafwithroot1))

從這個輸出中,我們也可以大致想象出依賴結(jié)構(gòu)。

iockids提供了豐富的注入錯誤異常報告,防止用戶注入配置出錯。

比如我們將上面的nodea和nodeb的名稱都配置成一樣的a,就會曝出下面的錯誤堆棧

?
1
2
3
4
iockids.injectexception: duplicated qualifier javax.inject.named with the same class iockids.demo.node
 at iockids.injector.registerqualifiedclass(injector.java:87)
 at iockids.injector.registerqualifiedclass(injector.java:70)
 at iockids.demo.demo.main(demo.java:106)

如果我們將nodeb的構(gòu)造器隨意加一個參數(shù)

?
1
2
3
4
@inject
public nodeb(leaf leaf, int k) {
 this.leaf = leaf;
}

運行時就會拋出下面的錯誤

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
iockids.injectexception: no accessible constructor for injection class int
 at iockids.injector.createnew(injector.java:120)
 at iockids.injector.createnew(injector.java:94)
 at iockids.injector.createfromparameter(injector.java:167)
 at iockids.injector.createfromconstructor(injector.java:145)
 at iockids.injector.createnew(injector.java:123)
 at iockids.injector.createfromqualified(injector.java:216)
 at iockids.injector.createfromfield(injector.java:173)
 at iockids.injector.injectmembers(injector.java:233)
 at iockids.injector.createnew(injector.java:136)
 at iockids.injector.createfromqualified(injector.java:216)
 at iockids.injector.createfromfield(injector.java:173)
 at iockids.injector.injectmembers(injector.java:233)
 at iockids.injector.createnew(injector.java:136)
 at iockids.injector.createnew(injector.java:94)
 at iockids.injector.getinstance(injector.java:245)
 at iockids.demo.demo.main(demo.java:107)

項目開源地址: https://github.com/pyloque/iockids

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對服務(wù)器之家的支持。

原文鏈接:https://mp.weixin.qq.com/s/R14Xaq2iSUbVphdVtRiyjg

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 99在线精品视频免费观看20 | 午夜视频在线免费 | 欧美大逼网 | 精品一区二区三区免费毛片爱 | 国产成人免费高清激情视频 | 日日噜噜噜夜夜狠狠久久蜜桃 | 午夜精品在线视频 | 中国的免费的视频 | 国产成人av免费 | 精品一二三区视频 | 成人做爰高潮片免费视频韩国 | 国产高潮失禁喷水爽到抽搐视频 | 国产精品久久国产精麻豆96堂 | 最新在线黄色网址 | 国产精品亚洲三区 | 91精彩在线 | 国产小视频在线 | 国产免费久久久久 | 538任你躁在线精品视频网站 | 欧美成人免费电影 | 美国av免费看 | 日韩在线观看视频一区 | 国产日产精品久久久久快鸭 | 日本不卡视频在线观看 | 激情在线视频 | 成人免费毛片网站 | 白白在线免费视频 | 亚洲国产超高清a毛毛片 | 久久久久久久亚洲视频 | 国产美女视频一区二区三区 | www.91在线观看 | 一本色道精品久久一区二区三区 | 九色com | 国产午夜免费 | 日韩在线观看高清 | 国产精品视频免费在线观看 | 黄色大片www | 中国hdxxxx护士爽在线观看 | 欧美成人精品一区二区三区 | 黄色网址免费在线播放 | 九草网|