`
snoopy7713
  • 浏览: 1149508 次
  • 性别: Icon_minigender_2
  • 来自: 火星郊区
博客专栏
Group-logo
OSGi
浏览量:0
社区版块
存档分类
最新评论

osgi 入门 三 关于类装载机制

    博客分类:
  • OSGi
阅读更多

osgi一个最大的特色就是使用不同的ClassLoader,让多个bundle共享一个虚拟机,而每一个bundle使用单独的ClassLoader。
如下图所示:

对于资源和类的装载主要包括以下三种途径:
Boot classpath:启动类环境,包括java.*包和相应的实现包。
Framework classpath:osgi框架拥有一个独立的ClassLoader,用于装载框架接口类,以及相应的实现类。
Bundle Space:每个bundle包括了与bundle相关的jar文件,以及相关的资源。

对于一个类的查询,主要通过以下途径进行查询:
1.从Parent ClassLoader中装载
2.从Import Package中查询类路径。
3.从Required bundles中查询类
4.自身bundle,相关ClassPath
5.相关的插件片段Fragment。
如下图

这么说起来,还是比较的抽象,还是从一个实例来具体的分析。
假设有如下Bundle,
相关的描述文件如下:

Java代码 复制代码 收藏代码
  1. Bundle:org.zframework.core
  2. Manifest-Version: 1.0
  3. Bundle-Name: core
  4. Bundle-SymbolicName: org.zframework.core;singleton:=true
  5. Bundle-ClassPath: .
  6. Import-Package: net.sf.ehcache;version="1.3.0" ,
  7. net.sf.ehcache.config;version="1.3.0" ,
  8. net.sf.ehcache.event;version="1.3.0" ,
  9. org.osgi.framework;version="1.4.0" ,
  10. org.osgi.service.log;version="1.3.0" ,
  11. ...
  12. Require-Bundle: org.eclipse.equinox.common;visibility:=reexport,
  13. ...
  14. Export-Package: org.zframework.core;version="1.0.0" ,
  15. ...
Bundle:org.zframework.core
Manifest-Version: 1.0
Bundle-Name: core
Bundle-SymbolicName: org.zframework.core;singleton:=true
Bundle-ClassPath: .
Import-Package: net.sf.ehcache;version="1.3.0",
 net.sf.ehcache.config;version="1.3.0",
 net.sf.ehcache.event;version="1.3.0",
 org.osgi.framework;version="1.4.0",
 org.osgi.service.log;version="1.3.0",
 ...
Require-Bundle: org.eclipse.equinox.common;visibility:=reexport,
 ...
Export-Package: org.zframework.core;version="1.0.0",
 ...



现在创建了如下的类:

Java代码 复制代码 收藏代码
  1. package org.zframework.core;
  2. import java.net.URL;
  3. import java.util.Collection;
  4. import net.sf.ehcache.Cache;
  5. import net.sf.ehcache.CacheManager;
  6. import net.sf.ehcache.Element;
  7. import org.osgi.framework.BundleContext;
  8. public class EhCacheManager extends AbstractCacheManager implements
  9. BundleContextAware {
  10. private String cacheFile;
  11. private BundleContext context;
  12. private CacheManager manager;
  13. public Cache getCache(String cacheName) {
  14. Cache cache = manager.getCache(cacheName);
  15. if (cache == null ) {
  16. ...
  17. }
  18. return cache;
  19. }
  20. ...
  21. }
package org.zframework.core;
import java.net.URL;
import java.util.Collection;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
import org.osgi.framework.BundleContext;
public class EhCacheManager extends AbstractCacheManager implements
    BundleContextAware {
    private String cacheFile;
    private BundleContext context;
    private CacheManager manager;
    public Cache getCache(String cacheName) {
    Cache cache = manager.getCache(cacheName);
    if (cache == null) {
          ...
    }
    return cache;
    }
    ...
}


假设有一个Bundle org.zframework.model需要使用此类,描述如下:

Java代码 复制代码 收藏代码
  1. Manifest-Version: 1.0
  2. Bundle-Name: model
  3. Bundle-SymbolicName: org.zframework.model;singleton:=true
  4. Bundle-ClassPath: .
  5. Import-Package: javax.persistence;version="1.0.0" ,
  6. javax.persistence.spi;version="1.0.0" ,
  7. org.osgi.framework;version="1.4.0" ,
  8. ...
  9. Require-Bundle: org.zframework.core
  10. 类Model
  11. package org.zframework.model;
  12. import java.net.URL;
  13. import java.util.Collection;
  14. import org.zframework.core.EhCacheManager ;
  15. public class Model{
  16. private EhCacheManager manager;
  17. public Object getCache(String key) {
  18. Object o = manager.getCache(key);
  19. return o;
  20. }
  21. ...
  22. }
Manifest-Version: 1.0
Bundle-Name: model
Bundle-SymbolicName: org.zframework.model;singleton:=true
Bundle-ClassPath: .
Import-Package: javax.persistence;version="1.0.0",
  javax.persistence.spi;version="1.0.0",
  org.osgi.framework;version="1.4.0",
  ...
 Require-Bundle: org.zframework.core

类Model
package org.zframework.model;
import java.net.URL;
import java.util.Collection;
import org.zframework.core.EhCacheManager ;
public class Model{
    private EhCacheManager manager;
    public Object getCache(String key) {
    Object o = manager.getCache(key);
    return o;
    }
    ...
}


下面简单说明一下装载过程:
在装载Model类时,
1.对于java.*类的装载,由相应的Boot ClassLoader 装载
2.装载EhCacheManager,
1.在Import-Package中查询是否存在匹配中的org.zframework.core包声明,如果有,则委派给org.zframework.core包声明的Bundle进行装载,本例没有,则继续。
2.在Require-Bundle中查询所有的Export声明包,判断是否存在org.zframework.core匹配。本例中,应该存在。如果不存在,则执行步骤2.3
3.查询本bundle的类路径,是否有此类存在。不存在,继续2.4步骤
4.查询所有的fragments bundle(特殊的bundle) 类路径。不存在,继续2.5步骤
5.判断是否使用DynamicImport-Package: * 声明,如果是则查询所有的bundle中声明的Export包。如果还是不存在,则抛出ClassNotFound例外。
关于DynamicImport-Package: * ,这是比较极端的设置,一般不会推荐使用,主要破坏了相关的封装性。
完整的类查询如下图:

关于类装载机制基本就是这些,对于初学者来说,这还是会有些困惑的。

分享到:
评论

相关推荐

    OSGI 入门资料PDF

    在本入门资料中,我们将探讨OSGI的关键概念、优势以及如何通过实战和最佳实践来掌握它。 1. OSGI原理: OSGI的核心在于它的模块系统,称为“bundle”。一个bundle是一个自包含的Java模块,包含了类、资源和元数据...

    OSGi入门教程(OSGi Introduce)

    2. **动态性**:OSGi提供了完整的交互机制,管理Bundle和服务的生命周期,允许系统在运行时动态地改变行为,增强了系统的灵活性和适应性。 3. **SOA兼容性**:OSGi遵循面向服务的架构(SOA)原则,创建规范且可重用...

    OSGI入门和例子

    标题"OSGI入门和例子"意味着我们将探讨OSGI的基本概念以及如何通过实例来学习和理解这个框架。下面,我们将深入讨论OSGI的关键知识点: 1. **模块系统**:OSGI的核心是模块化,它定义了一种基于Java导出和导入包的...

    OSGi入门资料-初探OSGi 的全文

    OSGi的入门资料,网上找的,初探OSGi 的全文

    OSGI入门和整合Spring

    学习OSGI入门和整合Spring,对于开发复杂的企业级应用,或者想要提升系统灵活性和可维护性的开发者来说,是非常有价值的。通过理解OSGI的模块化机制和Spring的依赖注入原理,可以构建出更加高效和可扩展的Java应用。

    spring-osgi 入门手册和代码

    - **依赖管理**:OSGi 的版本管理和依赖解析机制能有效解决类路径冲突问题。 - **灵活性**:Spring OSGi 可以与现有的 Spring 应用集成,同时利用 OSGi 的优势,提高应用程序的灵活性和可扩展性。 3. **开始使用 ...

    OSGI资料,OSGI进阶,OSGI实战,OSGI入门和整合Spring

    1. **Spring与OSGI集成原理**:Spring的bean管理如何与OSGI服务机制相结合,实现更灵活的依赖注入。 2. **Declarative Services(DS)**:利用OSGI的DS注解声明服务,简化Spring配置。 3. **Blueprint**:Spring的...

    Spring OSGi 入门.pdf

    - **导出OSGi服务:**可以将普通的Spring Bean导出为OSGi服务,示例中`<osgi:service>`元素定义了服务的实现类和服务接口。 #### 五、导出OSGi服务 - **将普通Spring Bean导出为OSGi服务:**如上所示,通过`<osgi:...

    OSGi 入门+进阶+实战

    1. **模块系统**:OSGi的核心是模块化,每个模块称为一个Bundle,它包含类、资源和元数据。Bundle之间通过导出和导入包来实现依赖关系。 2. **生命周期管理**:OSGi Bundle有启动、停止、安装、更新和卸载等状态,...

    Spring OSGi 入门.rar

    三、Spring OSGi 入门步骤 1. 安装OSGi容器:首先,你需要一个支持Spring OSGi的OSGi容器,如Apache Felix或Equinox。这些容器提供了运行Spring OSGi应用的基础环境。 2. 创建Spring OSGi Bundle:使用Spring的...

    OSGI入门资料(非常beautiful的ppt)

    很基础全面的OSGI ppt教程,讲解的很详细。

    osgi入门与实践

    ### OSGi 入门与实践 #### OSGi 的历史背景 OSGi,全称为 Open Service Gateway Initiative,从字面上理解,它最初被设计为一个面向服务的平台。1999 年,OSGi 联盟成立,旨在为通过网络向设备提供服务建立开放的...

    OSGi 入门 学习 实战 进阶

    OSGi的核心是其模块系统,即Bundle,每个Bundle都是一个独立的、自我包含的代码单元,有自己的类加载器。 《OSGi实战》这本书可能涵盖了如何在实际项目中应用OSGi技术,包括Bundle的创建、服务的注册和发现、依赖...

    探索 OSGi 框架的组件运行机制

    探索 OSGi 框架的组件运行机制探索 OSGi 框架的组件运行机制

    OSGi入门篇:服务层

    在OSGi框架中,服务层是位于应用程序之上的一层,它为服务提供者和消费者之间的交互提供了一种机制。这一层的主要目的是实现组件之间的松耦合通信,即组件不需要知道彼此的具体实现细节,仅通过服务接口进行通信。 ...

    OSGI 入门 示例

    关于SOA中热门技术OSGI的入门样例的经典版本,供对需要进行ERP设计和学习的入门读者使用的经典

    OSGi入门篇:模块层(by 静默虚空)

    在OSGi入门篇:模块层这篇文章中,作者静默虚空深入探讨了OSGi框架中模块层的基础知识以及设计模块层时OSGi联盟所做的考虑。OSGi模块层是框架中最基础的部分,它实现了Java的模块化特性,但又与Java现有的模块化特性...

Global site tag (gtag.js) - Google Analytics