`
billy_zh
  • 浏览: 61565 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jboss seam 中的 Component

阅读更多
本文讲述Seam组件的初始化和实例化过程。

初始化seam组件

SeamListener.contextInitialized(...)

  new Initialization(servletContext).create().init();

Initialization.create()

  StandardDeploymentStrategy.scan();
  通过UrlScanner 扫描包含 seam.properties, META-INF/seam.properties 或 META-INF/components.xml的文件夹和jar文件。
 
  ComponentDeploymentHandler.handle(...)
  针对每一个扫描到的ClassFile, 如满足以下两个条件,则标记为seam 组件:
  1. 有@Name标注或有一个同名的.component.xml文件存在;
  2. 无@Install标注或有@Install 标注且 value = false;

  initComponentsFromXmlDocument("/WEB-INF/components.xml")
  安装WEB-INF/components.xml中定义的组件;

  initComponentsFromXmlDocuments();
  安装所有META-INF/components.xml中定义的组件;

Initialization.init()

  scanForComponents()
  安装StandardDeploymentStrategy扫描到的seam组件;
 
  addComponent( new ComponentDescriptor(Init.class), ...)
  安装Init组件;

  addSpecialComponents(init)
  安装PojoCache组件;

  installComponents(init)
  安装依赖组件?
 
Initialization.addComponent(descriptor, context)

  component = new Component(...);
  context.set(componentName, component);
  所有的Seam组件都安装到了ApplicationContext中了.下面我们来看如何获得组件。


Seam组件的实例化

即然组件交由seam来管理,那么就不能使用new来实例化了,必须通过Component对象来完成。

Component.newInstance()
  instance = instantiate();
  if (getScope()!=STATELESS) {
     //存入Context, 
     getScope().getContext().set(name, instance); 
     ......
  }


Component.instantiate()
  switch(type) {
    case JAVA_BEAN:
      return instantiateJavaBean();
    case ENTITY_BEAN:
      return instantiateEntityBean();
    case STATELESS_SESSION_BEAN:
    case STATEFUL_SESSION_BEAN:
      return instantiateSessionBean();
    ......
  }

  根据组件的类型执行不同的实例化操作。


Pojo组件的实例化

Component.instantiateJavaBean()
  Object bean = getBeanClass().newInstance();
  if (!interceptionEnabled) {
    initialize(bean);
    callPostConstructMethod(bean);
  } 
  else {
    JavaBeanInterceptor interceptor = new JavaBeanInterceptor(bean, this);
    bean = wrap(bean, interceptor); // 创建Proxy对象
    interceptor.postConstruct(); // 由PostConstruct调用initialize(bean)
  }  


  判断此组件是否允许被Interceptor,这由BypassInterceptors描述决定,
  如允许被Interceptor,则创建Proxy对象并加入interceptor对象,
  有关Interceptor的内容我们将在下一篇文章中详述。
 
Entity组件的实例化

Component.instantiateEntityBean()
  Object bean = getBeanClass().newInstance();
  initialize(bean);

Session组件的实例化

Component.instantiateSessionBean()
  Object bean = Naming.getInitialContext().lookup(jndiName);
  return wrap(bean, new ClientSideInterceptor(bean, this));

  Session组件由JNDI进行管理,获得Session组件后,创建一个Proxy对象对它进行封装,
  ClientSideInterceptor为客户端的拦截器。


Seam组件的调用

通过Component类,可以非常容易的获得seam组件,查找的顺序如下:

1. Seam从给定的Scope Context中查找,如未指定Scope,则查找所有Context;
2. 如未找到组件,则查找是否有工厂方法;
3. 如未找到工厂方法,则使用newInstance方法实例化组件并存入相应Scope的Context中;
4. unwrap组件;

Component.getInstance(name)
  // 查找所有Context
  Object result = Contexts.lookupInStatefulContexts(name);
  result = getInstance(name, create, result);
  return result;

Component.getInstance(name, scope)
  // 查找scope的Context
  Object result = scope==STATELESS ? null : scope.getContext().get(name);
  result = getInstance(name, create, result);
  return result;

Component.getInstance(name, create, result)
  if (result == null && create) {
    // 通过工厂模式创建.
    result = getInstanceFromFactory(name);
    if (result == null) {
      if (component== null) {
      }
      else if (component.getScope().isContextActive()) {
        // 检查Context是否为激活状态
        result = component.newInstance();
      }
    }

    if (result != null) {
      if (component != null) {
        if (!component.isInstance(result)) {
           // 检查result为有效的bean实例
           if (component.hasUnwrapMethod()) 
             return result;
        }
        result = component.unwrap(result);
      }
    }
    return result;
  }
分享到:
评论
2 楼 afadgaeg 2008-11-28  
  installComponents(init)
  安装依赖组件?

installComponents(init)并不是安装依赖组件
实际上前面的步骤把组件信息以ComponentDescriptor形式存在Initialization.componentDescriptors中,
installComponents(init)这一步才真正把组件放入ServletContext中
DependencyManager是个辅助类,效用猜吧,我也没仔细看这个类
有用的初始化信息存入Init实例(应用上下文,保存在ServletContext中),然后销毁当前线程。
1 楼 afadgaeg 2008-11-08  
好文         

相关推荐

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    1.3. Seam 中的可点击列表:消息示例............................................................................................................................. 27 1.3.1. 理解代码.........................

    Beginning JBoss Seam

    3. **核心组件**:深入探讨了JBoss Seam的关键组件,如Conversation Scope、Event System、Component Model等,并解释了它们如何协同工作以实现复杂的业务逻辑。 4. **Web 2.0应用开发**:讲解了如何利用JBoss ...

    jboss Seam2.0 语境相关的组件文档

    - **Component Context**:管理Seam组件的实例,确保每个请求或会话有独立的组件实例。 - **Event Context**:处理事件的发布和订阅,允许组件之间的通信。 **2. 依赖注入(Dependency Injection, DI)** Seam的DI...

    JBOSS SEAM

    在Seam中,组件(Component)是核心概念,它不仅包括了传统的MVC(Model-View-Controller)模型中的所有元素,还引入了“会话”(Conversation)的概念,使得组件能够在多个请求之间保持状态,从而实现更复杂的交互...

    Practical_JBoss_Seam书的源代码

    《Practical JBoss Seam》是一本深入探讨JBoss Seam框架技术的书籍,其源代码包含在提供的压缩包中。Seam是一种开源的企业级Java框架,它整合了多种技术和概念,如JavaServer Faces (JSF)、Java Persistence API ...

    java培训课程-JBOSS-SEAM开发.pptx

    Java培训课程-JBOSS-SEAM开发主要涵盖了Java企业级应用开发中的关键技术和框架,特别是JBOSS SEAM的应用。SEAM是一个全面的Java EE框架,旨在简化开发过程,提高开发效率,同时提供了丰富的功能来处理复杂的业务逻辑...

    java+架构系列培训课程_JBOSS_SEAM开发

    在探讨JBOSS SEAM开发之前,我们首先理解为何SEAM框架成为Java Web应用开发中的优选。SEAM提供了诸多优势,使其在众多框架中脱颖而出: 1. **增加AJAX特性**:SEAM通过简化AJAX的使用,让开发者能够迅速在应用程序...

    Manning JBoss in Action: Configuring the JBoss Application Server

    Beyond coverage of the core application server, the book also teaches how to use some of the "hot" technologies that run on top of the application server, such as Jboss Seam and JBoss Portal....

    深入浅出JBoss_2BSeam

    关于Seam,书里会详细讲解其核心概念,如Component、Conversation、Injection等,并通过实例展示如何创建和管理Seam应用。 书中可能涵盖以下内容: 1. JBoss安装与配置:详细步骤指导,包括系统需求、下载、解压、...

    Seam in Action - MEAP - 2008

    **JBoss Seam** 是一个针对 Java EE 的应用框架,旨在通过统一组件架构简化 Web 应用程序的开发过程。Seam 构建在 EJB 3 规范的基础上,充分利用了该规范中的创新变化,如注解而非容器接口、异常配置而非冗长的 XML ...

    Simple JSF application with RichFaces

    如果项目中使用了JBoss Seam框架,还需要额外配置以确保与RichFaces兼容。具体配置可参考JBoss Seam官方文档。 ### 四、RichFaces框架的基本概念 #### 4.1 引言 RichFaces是一个强大的Ajax框架,它扩展了JSF标准...

    A4J_ User_Guide

    - **JBoss Seam 支持**: 与 JBoss Seam 框架集成。 #### 八、与 IDE 集成 - **Eclipse**: 提供插件支持。 - **NetBeans**: 集成开发环境支持。 - **IntelliJ IDEA**: 支持集成开发环境。 #### 九、Exadel VCP 和 ...

    richFaces帮助文档

    此外,还支持JBoss Seam等框架,以增强应用的功能性和灵活性。 ##### 2.3 支持的服务器 支持的服务器包括但不限于: - **Apache Tomcat** - **JBoss AS / WildFly** - **GlassFish** - **WebLogic** - **...

    ajax 4jsf用户指南中文版

    - Sun JSF RI、Apache MyFaces、Facelets支持、JBoss Seam支持等特定设置。 - 针对不同JSF实现的特定配置项。 #### 八、与IDE集成 - **IDE集成**:支持与Eclipse、NetBeans等流行开发环境的集成,提高开发效率。 ...

    ajax4jsf中文用户指南

    同时,确保你的服务器也在Ajax4JSF的支持列表中,例如Tomcat、JBoss等。对于浏览器,Ajax4JSF通常支持主流的现代浏览器。 **下载与安装**:从官方网站或其他可靠来源下载Ajax4JSF的最新版本,然后按照文档指示将其...

Global site tag (gtag.js) - Google Analytics