強悍的上下文Context

2021-09-23 20:58:16 字數 4787 閱讀 2205

在乙個框架中,許多地方都要用到上下文(context),可以說上下文的實現是否到位,直接關係到開發的便捷性及訪問效率。

什麼是上下文呢?上下文可以認為是在訪問者和被訪問者之間進行資訊傳遞的紐帶。一般的,我們函式之間呼叫時通過函式引數及返回值來做做資料的傳入和傳出,但是,這樣就會出現不同訪問之間的引數都是不同的,在程式中訪問的時候,這當然沒有問題。但是對於框架來說,它事件不知道你要用什麼方式呼叫,提供的函式及返回值是什麼也不知道,這個時候一般來說,會提供乙個上下文(context)來提供資料傳入和傳出,當然,也有的人叫它資料匯流排。

tiny框架是乙個soa體系,因此,肯定要涉及上下文的問題;同時,還提供了流程編排的框架,這就更離不開上下文了。

我們來描述一次請求看看資料的流轉,比如:我們有乙個服務原型是:string sayhello(string name);這樣,在頁面請求時,需要輸入乙個name的引數,給控制層,控制層呼叫遠端服務來訪問sayhello服務,然後返回值,並讓展現層進行展現:

瀏覽器端輸入以下url:***.***/***/sayhello.do?name=abc,這個時候控制層從request中讀到了name的值為abc,這個時候,去呼叫遠端服務,就要構建服務呼叫上下文,在服務呼叫上下文中放置name:abc鍵值對,然後呼叫遠端服務,遠端服務處理,拿到上下文,根據呼叫的服務讀出引數,並呼叫sayhello服務,這個服務可能是乙個流程,那麼這個引數又要傳給流程的上下文進行執行,執行出結果之後,又要按照原路進行返回。

說得比較囉嗦,但是還是表明了資料需要在許多個上下文之間進行流轉。雖然這個過程,對於普通開發人員及使用者來說,是看不到的,但是它就在那裡,這個過程總是有的。

這時,如何讓資料在上下文中傳遞就是非常困難的,最簡單的方式就是資料複製,把上下文中的資料都複製到新的上下文中,但是這時有個問題,有時候,你複製了許多資料,但是真正用到的資料很少,當然結果返回也是要一路複製回去的,這就導致了浪費,同時也消耗了時間和空間。

為此我們提出了上下文巢狀模式,通過上下文互相巢狀來避免資料複雜帶來的效能影響,從此資料不再需要複製。

基本的上下文介面如下,可以看出,它和map的介面是非常相似的:?

12

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

publicinte***cebasecontext

接下來定義多層次上下文介面:?

12

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

88

89

90

91

92

93

/**

* 多層環境

*

* @author luoguo

*

*/

publicinte***cecontextextendsbasecontext

可以看到,引入了父環境和子環境的概念,乙個上下文只能有乙個父環境,但是可以有多個子環境。通過環境巢狀,我們簡單的解決了環境變數的複製問題。 

上下文變數的讀取,也很簡單,採用遞迴演算法,先從當前上下文讀取,當前上下文中讀不到的時候,就從子上下文讀,子上下文讀不到的時候,再從父上下文讀。

於是我們構建了乙個完美的死迴圈--這個是真的,實際上程式真的就陷入了死迴圈之中,接下來我們的注意力就集中在如何讓死迴圈不死上,這個問題當然必須要解決,解決掉死迴圈之後,所有關係上下文之上的難題就都沒有了,至此,我們擁有了高效的易用的上下文,下面看看測試用例:?

12

3

4

5

6

7

8

9

10

11

publicvoidtestgetsubcontextmap()

可以看到,確實,只要把testcontext放在context之間,它們就可以互相訪問對方的變數。 

上下文的重要性在tiny框架中是毫無置疑的,它大大簡化了程式結構,提公升了訪問效率,在許多的子工程中都引用了上下文,可以說,沒有上下文的良好實現,就不會有後續的高效與易用。

幾個context上下文

servletcontext,乙個 web 運用程式只有乙個 servletcontext 例項,它是在容器 包括 jboss,tomcat 等 完全啟動 web 專案之前被建立,生命週期伴隨整個 web 運用 actioncontext,actioncontext 是當前 action 執行時的上...

Android獲取上下文Context

context字面意思上下文,位於frameworkpackage的android.content.context中,其實該類為long型,類似win32中的handle控制代碼,很多方法需要通過context才能識別呼叫者的例項,比如說toast的第乙個引數就是context,一般在activit...

Context上下文 解釋 摘要

context是乙個類,該類封裝了每個使用者會話 當前 http 請求 請求的頁等方面的資訊。使這些類的例項可用作您可以從 訪問的內部物件。下表列出這些內部物件,同時也列出生成這些例項的類。物件名 說明 response 提供對當前頁的輸出流的訪問。您可以使用此類將文字插入頁中 編寫 cookie,...