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

seam中的factory

    博客分类:
  • seam
阅读更多

实现原理

工厂的定义有三种方式 1<factory method  2<factory value 3)组件类中的@Factory(

Component.getInstance

所有组件的使用都是从Component.getInstance开始的,包括Namefactory

1)  首先从上下文中找组件

2)  如果找不到再通过工厂定义创建或组件定义newInstance

3)  将结果进行Unwrap处理,如果结果不是组件实例并且组件有Unwrap注释,就直接返回结果,否则报异常;如果结果是组件实例再进行Unwrap处理

Object result = Contexts.lookupInStatefulContexts(name);

if (result==null && create)

      {

        result = getInstanceFromFactory(name);

        if (result==null)

        {

           if (component==null)

           {

           }

           else if ( component.getScope().isContextActive() )

           {

              result = component.newInstance();

           }

        }

      }

if (result!=null)

      {

         if (component!=null)

         {

            if ( !component.isInstance(result) )不是组件的实例,有Unwrap注释就直接返回,没有报异常

            {

               if ( component.hasUnwrapMethod() ) return result; ///best way???

               throw new IllegalArgumentException( "….”);

            }

            result = component.unwrap(result);获取的是组件,再进行unwrap处理

         }

      }

getInstanceFromFactory(String name)

三种工厂定义都设置进Init中,配置优先与类中定义

Init init = Init.instance();

      if (init==null) //for unit tests, yew!

      {

         return null;

      }

      else

      {

         Init.FactoryMethod factoryMethod = init.getFactory(name);

//组件方法工厂,执行组件的方法

         Init.FactoryExpression methodBinding = init.getFactoryMethodExpression(name);

//配置方法工厂

         Init.FactoryExpression valueBinding = init.getFactoryValueExpression(name);

//配置值工厂

         if ( methodBinding!=null && getOutScope( methodBinding.getScope(), null ).isContextActive() ) //let the XML take precedence

         {

            Object result = methodBinding.getMethodBinding().invoke();

            return handleFactoryMethodResult( name, null, result, methodBinding.getScope() );

         }

         else if ( valueBinding!=null && getOutScope( valueBinding.getScope(), null ).isContextActive() ) //let the XML take precedence

         {

            Object result = valueBinding.getValueBinding().getValue();

            return handleFactoryMethodResult( name, null, result, valueBinding.getScope() );

         }

         else if ( factoryMethod!=null && getOutScope( factoryMethod.getScope(), factoryMethod.getComponent() ).isContextActive() )

         {

            Object factory = Component.getInstance( factoryMethod.getComponent().getName(), true );

            if (factory==null)

            {

               return null;

            }

            else

            {

               Object result = factoryMethod.getComponent().callComponentMethod( factory, factoryMethod.getMethod() );

               return handleFactoryMethodResult( name, factoryMethod.getComponent(), result, factoryMethod.getScope() );

            }

         }

         else

         {

            return null;

         }

      }

handleFactoryMethodResult

result为工厂方法返回的值或值绑定的值,如果

handleFactoryMethodResult(String name, Component component, Object result, ScopeType scope)

   {

      Object value = Contexts.lookupInStatefulContexts(name); //see if a value was outjected by the factory method

      if (value==null) //usually a factory method returning a value

      {

         ScopeType outScope = getOutScope(scope, component);

         if ( outScope!=STATELESS )

         {

            outScope.getContext().set(name, result);

         }

         return result;

      }

      else //usually a factory method with a void return type

      {

         if (scope!=UNSPECIFIED)

         {

            throw new IllegalArgumentException("factory method with defined scope outjected a value: " + name);

         }

         return value;

在配置文件

1<factory> 声明让你指定一个值或者方法来绑定一个表达式,当它第一次被引用时,将被执行用来初始化一个context变量的值。

 

<factory name="contact" method="#{contactManager.loadContact}" scope="CONVERSATION"/>

<factory name="user" value="#{actor}" scope="STATELESS"/>

<factory name="contact" value="#{contactManager.contact}" scope="STATELESS"/>

 

2)你也可以为Seam组件创建一个别名(第二个名字)

<factory name="user" value="#{actor}" scope="STATELESS"/>

<factory name="contact" value="#{contactManager.contact}" scope="STATELESS"/>

 

3auto-create="true" 用在 <factory> 声明中尤其常见

<factory name="session" value="#{entityManager.delegate}" scope="STATELESS" auto-create="true"/>

在组件类中

有两种工厂方法。

第一种返回一个值,Seam会把它绑定到上下文里:

第二种方法返回 void,它自己把值绑定到上下文变量:

@Factory(scope=CONVERSATION)
public List<Customer> getCustomerList() {//没有指定工厂名字就按bean取方法名称
    return ... ;
} 
 
 
与类的属性配合使用
@DataModel List<Customer> customerList;
@Factory("customerList")
public void initCustomerList() {
    customerList = ...  ;
} 

@Unwrap

一个组件只能有一个@Unwrap

 

两种情况下,当我们引用 customerList 上下文变量,而其值为null时,工厂方法被调用,然后对这个值生命周期的其他部分就无法操纵了。更加强大的模式是 manager component pattern(管理者组件模式)。 在这种情况下,有一个Seam组件绑定到上下文变量,它管理着上下文变量的值,对客户端不可见。

管理者组件可以是任何组件,它需要一个 @Unwrap 方法。 该方法返回对客户端可见的值,每次 上下文变量被引用的时候都会被调用。

@Name("customerList")
@Scope(CONVERSATION)
public class CustomerListManager
{
    ...</
分享到:
评论

相关推荐

    SEAM 中文开发指南

    ### SEAM 中文开发指南知识点概述 #### 一、SEAM 框架简介 - **SEAM**:SEAM 是一个基于 Java EE 的企业级应用框架,它简化了复杂的应用程序开发过程,并且提供了丰富的功能来支持业务逻辑的实现。 - **版本信息**...

    jboss seam 中文文档集合

    JFreeChart-1.0.5-Ch.chm提供了详细教程和示例,帮助开发者利用JFreeChart在Seam应用中展示数据。 **7. ANTLR** ANTLR 是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。ANTLR中文...

    seam 中文文档 pdf

    seam 中文文档 pdf 格式 JSF+EJB3.0快速开发框架Seam的中文版向导。。。

    JBOSS SEAM组件中文手册

    Seam的主要目标是减少开发中的样板代码,提高生产力,同时保持灵活性和可扩展性。 **二、Seam核心概念** 1. **组件(Components)**: Seam的核心是组件模型,它允许开发者定义和管理应用中的对象。组件可以是简单的...

    seam需要的jar包

    在这个“seam需要的jar包”压缩包中,包含了运行和开发Seam应用程序所需的各种库文件。 首先,Seam框架的核心依赖于JSF,这是Java EE中的一个用户界面组件框架,用于构建交互式Web应用。JSF提供了模型-视图-控制器...

    Seam2.0GA 中文开发指南

    Seam入门部分介绍了如何在不同的服务器环境中部署和运行Seam应用实例,包括JBoss AS和Tomcat服务器。 **1.1.1 在JBoss AS上运行示例** 在JBoss AS上部署和运行Seam应用,首先需要确保JBoss AS服务器已经正确安装并...

    seam in action 中文 english

    7. **国际化与本地化**:Seam支持多语言环境,对于中英文双语版本的书籍,这为开发者提供了跨越语言障碍的便利,帮助全球的开发者理解和使用Seam框架。 8. **测试支持**:Seam提供了一套完整的测试工具,包括单元...

    jboss seam 中文文档

    - **理解 Seam 业务对话(Conversation)**:解释了业务对话在 Seam 中的作用和意义,以及如何设计有效的对话来提高用户体验。 - **Seam 的 UI 控制库**:介绍了 Seam 提供的一系列 UI 控件,这些控件可以帮助开发者...

    seam 2中文手册

    seam下一代web开发框架

    jboss seam 2.0 中文手册

    整理自jboss seam 中文站,压缩为chm格式,便于广大jboss seam爱好者阅读,所有版权归jboss seam中文站所有。

    jboss seam中文资料

    这份资料提供了丰富的示例代码和项目,通过这些实例,开发者可以深入理解Seam的工作原理以及如何在实际项目中应用它。这种方法能够确保理论与实践相结合,使学习过程更加高效。 #### 四、核心特性详解 - **组件模型...

    Jboss Seam中文版

    1. **在JBoss AS上运行示例**:首先需要安装配置JBoss AS服务器,然后导入Seam项目到服务器中进行部署。 2. **在Tomcat服务器上运行示例**:Tomcat作为轻量级的应用服务器,可以快速部署简单的Seam应用,便于学习和...

    JSF项目中seam的配置

    在JSF项目中配置Seam,可以充分利用其优势,如组件管理、对话管理、事件处理等。 首先,配置Seam的关键在于以下几个方面: 1. **阶段监听器配置**:在`faces-config.xml`中添加`SeamPhaseListener`。这是Seam启动...

    jboss seam 学习资料,seam in action和官方手册

    6. **国际化与本地化**:学习如何在Seam项目中实现多语言支持。 7. **测试与调试**:掌握Seam的测试工具和策略,确保代码质量。 8. **Seam组件**:了解如Conversation、Transactions、邮件服务等Seam内置组件的使用...

    seam_carving 代码实现 seam

    2. **寻找最佳路径**: 在确定能量函数后,算法会在图像中寻找一条能量最低的“拉链”(即 seam),这条拉链将沿着图像的垂直或水平方向穿过。在垂直方向上,拉链的每一像素与上一行的像素相对应,而在水平方向上,...

    《SeamInAction》+《JbossSeam》+《官方中文指南》

    Seam是一个全面的Java开发框架,专...总之,拥有《Seam In Action》、《JBoss Seam》和《官方中文指南》这些资源,开发者可以系统地学习和精通Seam框架,从而在企业级Java应用开发中游刃有余,提高开发效率和应用质量。

    seam的注解和标签

    在Seam框架中,注解和标签起着至关重要的作用,它们简化了代码并增强了可读性。下面我们将详细讨论Seam中的注解以及与之相关的标签。 1. **Seam注解** - `@Name`: 这是Seam的核心注解,用于为组件定义一个唯一的...

    为Seam做好准备

    Seam是一个Java EE集成框架,它将JavaServer Faces(JSF)、Java Persistence API(JPA)、Enterprise JavaBeans(EJB)3.0以及其他组件统一在一个简化开发的环境中。这篇博客的链接虽然无法直接访问,但我们可以...

    MATLAB_Seam_Carving_seamcarving_

    下面将详细阐述seam carving的基本原理、实现过程以及在MATLAB中的应用。 Seam Carving是一种基于能量的图像缩放技术,由Ariel Shamir和Shai Avidan在2007年提出。它的核心思想是找出图像中的一条或多条“能量最低...

Global site tag (gtag.js) - Google Analytics