成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

OSGi依賴性管理:Bundle訪問域

開發 后端
OSGi允許您把您的應用程序分成多個模塊,并能管理這些模塊之間的依賴性。本文介紹了OSGi依賴性管理的概念。

本文是《你好,OSGi》系列的第三部分。之前介紹過OSGi是什么,以及OSGi Bundle的使用,下面介紹OSGi依賴性管理。

OSGi依賴性管理

OSGi允許您把您的應用程序分成多個模塊,并能管理這些模塊之間的依賴性。為了達到這個目的,它引入了Bundle訪問域的概念。Bundle中類的缺省訪問范圍只對本Bundle內部可見,但對其它任何Bundle都是不可見的;在Bundle內部,類的可訪問性遵循Java語言的一般規范。那么,您如果想要從一個Bundle中訪問另一個Bundle中的類,您應該怎么辦呢?解決方法是將源Bundle中的包導出來,然后把它們導入到目標Bundle中。在本小結中,我們將通過一個示例程序說明這個概念。

首先,我們新建一個名com.javaworld.sample.HelloService的Bundle,并從其中導出一個包,然后將該包導入到我們的com.javaworld.sample.HelloWorld Bundle中。

4.1. 導出Java包

我們開始新建一個com.javaworld.sample.HelloServiceBundle,并從其中導出一個Java包,具體步驟如下:

1) 新建com.javaworld.sample.HelloService Bundle,具體步驟請參見上小節中新建com.javaworld.sample.HelloWorldBundle的步驟;

2) 在HelloService Bundle中,新建一個com.javaworld.sample.service.HelloService.java接口,其源代碼如清單3所示。

源代碼清單3. HelloService.java

  1. package com.javaworld.sample.service;  
  2. public interface HelloService {  
  3. public String sayHello();  
  4. }  
  5.  

3) 新建類com.javaworld.sample.service.impl.HelloServiceImpl.java,該類實現HelloService接口,其源代碼如清單4所示。

源代碼清單4. HelloServiceImpl.java

  1. package com.javaworld.sample.service.impl;  
  2. import com.javaworld.sample.service.HelloService;  
  3. public class HelloServiceImpl implements HelloService {  
  4. public StringsayHello() {  
  5. System.out.println("InsideHelloServiceImple.sayHello()");  
  6. return"Say Hello";  
  7. }  
  8. }  
  9.  

4) 請在您的Eclipse Manifest編輯器中打開HelloService包中的MANIFEST.MF文件,點擊“Runtime(運行時)” 標簽,在“導出包”小節,單擊“Add(添加)”按鈕,并選擇com.javaworld.sample.service包。這時,HelloServiceBundle中的MANIFEST.MF文件代碼應如源代碼清單5所示。

源代碼清單5. HelloService Bundle中的Manifest文件

  1. Manifest-Version: 1.0 
  2. Bundle-ManifestVersion: 2 
  3. Bundle-Name: HelloService Plug-in  
  4. Bundle-SymbolicName:com.javaworld.sample.HelloService  
  5. Bundle-Version: 1.0.0 
  6. Bundle-Vendor: JAVAWORLD  
  7. Bundle-Localization: plugin  
  8. Export-Package: com.javaworld.sample.service  
  9. Import-Package:org.osgi.framework;version="1.3.0" 
  10.  

您可以看到,HelloService Bundle中的MANIFEST.MF文件和HelloWorldBundle非常相似,唯一的區別就是多了一個Export-Package屬性頭,該屬性頭的值為com.javaworld.sample.service;Export-Package屬性頭通知OSGi容器,其它Bundle可以從HelloService Bundle外面訪問com.javaworld.sample.service包中的類。請注意,在示例代碼中,我們只暴露了接口類HelloService,而沒有暴露其實現類的HelloServiceImpl。

4.2. 導入Java包

下面,我們將從HelloServiceBundle中導出的com.javaworld.sample.service包并將其導入到HelloWorldBundle中,具體步驟如下:

1). 請在com.javaworld.sample.HelloWorld Bundle中找到MANIFEST.MF文件,并在Manifest編輯器中打開,點擊“Dependencies(依賴性)”標簽,然后點擊“ImportPackage(導入包)”按鈕,將com.javaworld.sample.service添加為導入包,這時,您的HelloWorldBundle中的MANIFEST.MF文件內容應如源代碼清單6所示:

源代碼清單6. HelloWorld Bundle中的MANIFEST.MF文件

  1. Manifest-Version: 1.0 
  2. Bundle-ManifestVersion: 2 
  3. Bundle-Name: HelloWorld Plug-in  
  4. Bundle-SymbolicName: com.javaworld.sample.HelloWorld  
  5. Bundle-Version: 1.0.0 
  6. Bundle-Activator: com.javaworld.sample.helloworld.Activator  
  7. Bundle-Vendor: JAVAWORLD  
  8. Bundle-Localization: plugin  
  9. Import-Package: com.javaworld.sample.service,  
  10. org.osgi.framework;version="1.3.0" 
  11.  

從上面的代碼可以看出,Import-Package屬性頭的值是一個由逗號分隔的字符串,這是您想導入包的列表。在HelloWorldBundle示例代碼中,我們引入了兩個包,即com.javaworld.sample.service和org.osgi.framework。

org.osgi.framework包中包含有OSGi框架類,比如,在HelloWorldBundle中的Activator.java中用到的BundleContext和BundleActivator類都屬于這個包。

2) 下面,請在Eclipse Java編輯器中打開com.javaworld.sample.helloworld.Activator.java,您會注意到,您現在可以訪問HelloService接口,但不能訪問HelloServiceImpl實現類,這是因為HelloServiceBunlde只導出了com.javaworld.sampel.service包,同時HelloWorldBundle也導入了這個包。HelloServiceImpl是HelloServiceBundle的一個內部類,任何其它的Bundle都不能訪問它。

4.3. 類級別上的訪問域

如果您運行示例的HelloService服務包,它會在Eclipse控制臺上打印出”HelloWorld”。但是,如果您想在HelloWorld Bundle的Activator中訪問HelloServiceImpl類,這時,編譯沒有問題,但在OSGi容器中運行這個Bundle時會拋出異常。

OSGi容器是如何能將jar文件中的一些類隱藏掉,而讓另外一些類可見呢?這是因為OSGi容器使用Java類加載器來管理類的可見性,OSGi容器為每個Bundle創建不同的類加載器,因此每個Bundle能訪問位于下列位置中的類:

a) 位于Java啟動類路徑下的、所有以Java.*開頭的包中的類;

b) 位于OSGi框架類路徑下的類,通常有一個獨立的類加載器負責加載框架的實現類及關鍵的接口類;

c) 位于Bundle空間中的類,這些類通常包含在與Bundle相關的jar文件中,以及加到這個Bundle中的其它jar包中的類。

d) 導入包中的類,例如,HelloWorld Bundle導入了com.javaworld.sample.service包,因此它能訪問該包中的類。Bundle級別的訪問域是OSGi一個非常強大的功能,例如,它可以讓您安全地更新HelloServiceImpl.java類,而不必擔心依賴于這個類的代碼受到破壞。

以上就大概介紹了OSGi依賴性管理的概念。

【編輯推薦】

  1. OSGi Bundle之Hello World
  2. OSGi是什么:Java語言的動態模塊系統
  3. OSGi 4.2將于8月發布 新版特性預覽
  4. Spring Tool Suite開始支持OSGi
  5. 基于OSGi的動態化系統搭建
責任編輯:yangsai 來源: Carl的博客
相關推薦

2021-06-09 08:32:15

開源Google安全工具

2009-09-16 17:15:19

OSGi Bundle

2009-09-29 09:16:23

啟動bundleOSGi

2021-05-26 09:00:00

Node.js開發模塊

2009-07-28 15:03:02

依賴性注入

2020-03-14 16:37:09

數據庫IT技術

2014-08-19 09:33:29

FedoraCentOSRPM

2009-12-29 09:15:00

2018-04-24 09:16:38

更優時間依賴性情感識別

2009-09-28 13:32:39

OSGi入門

2024-04-03 09:03:05

2009-06-01 11:12:34

OSGi規范架構體系結構

2009-06-10 18:12:38

Equinox動態化OSGi動態化

2012-06-25 11:47:14

ibmdw

2009-06-18 15:24:08

Spring OSGi

2011-02-17 08:49:49

WebHTMLCSS

2022-02-13 00:13:26

云安全數據安全

2024-06-24 08:24:57

2009-06-01 11:20:21

OSGi服務規范非贏利機構

2009-06-25 15:33:48

OSGi方式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩电影一区 | 伊色综合久久之综合久久 | 中国av在线免费观看 | 国产色爽 | 国产精品色 | 男人的天堂中文字幕 | 国产精品日韩欧美一区二区三区 | 亚洲成人天堂 | 久久无毛| 爽爽免费视频 | 欧美在线观看免费观看视频 | 嫩草视频入口 | 福利一区二区在线 | 国产一区二区在线91 | 成人免费观看网站 | 精品久久一区二区三区 | 国产精品久久久久久久久久久久冷 | 亚洲精品电影网在线观看 | 91视频在线观看免费 | 亚洲色图综合 | h在线免费观看 | 天天看天天爽 | 最新国产精品 | 久久91av| 日韩精品免费视频 | 成人高清在线视频 | 美女天天干天天操 | 成人在线观看黄 | 免费欧美 | 欧美日韩国产精品激情在线播放 | 夜夜爽99久久国产综合精品女不卡 | 亚洲综合视频 | 欧美一区二区三区在线看 | 国产精品毛片久久久久久 | 日韩一区二区视频 | 国产亚洲一区二区三区在线观看 | 亚洲一区在线播放 | 91中文在线观看 | 成人免费视频在线观看 | 中日av | 日韩欧美在线视频 |