Seam技术分析

2024-03-26 18:08
文章标签 分析 技术 seam

本文主要是介绍Seam技术分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

JBoss Seam是“Java EE 5.0的一个轻量级的框架”。它工作在Java EE 5.0框架的上层,为所有的在企业Web应用中的组件提供了一个统一的、易于理解的编程模型。它同样使基于状态的应用和业务流程驱动的应用的开发易如反掌。换句话说,Seam致力于开发者生产力和应用扩展性。

1.1   整合和强化Java EE框架

Java EE5.0的核心框架是EJB(Enterprise JavaBeans)3.0JSF(JavaServer Faces)1.2EJB 3.0(以下简称EJB3)是基于一个POJO(Plain Old Java Objects)的业务服务和数据库持久化的轻型框架。JSF是一个基于MVC(Model-View-Controller)Web应用框架。大多数的Web应用都将包含有业务逻辑的EJB3组件和Web应用前端显示的JSF组件。EJB3JSF虽然互补,但是他们是根据各自的理念设计的独立的框架。例如,EJB3使用注解(annotation)来配置服务,而JSF使用的是XML文件。更进一步讲,EJB3JSF组件在框架层面上是互不敏感的。要整合EJB3JSF,开发者必须手动地构造facade对象(如:JSF支持bean),将业务组件与Web页面和样板代码(又称plumbing代码)联结起来,以便能跨框架调用方法。将这些技术粘合起来是Seam的职责之一。

Seam打破了EJB3JSF之间的人工层,它为整合EJB3JSF提供了一个一致的,基于注解的途径。只需要个别简单的注解,Seam中的EJB3业务组件就能直接被用来支持JSF Web表单或者处理Web UI事件。Seam允许开发者将“同一种东西”??有注解的POJOs??应用与所有的应用组件。与其他Web框架开发的应用相比,Seam应用概念简洁,同样的功能却需要较少的代码(在JAVAXML中)。如果没有耐心,或者想要快速预览,一个Seam到底有多简单,你可以现看看本文描述的hello world一例。

JSP来说困难的任务,Seam可以轻易的完成。例如,JSF头疼的一个问题就是过分依赖HTTP POST。这使得将一个添加到书签中的JSF网页,通过HTTP GET访问相当困难。但是有了Seam,生成一个REST网页是非常容易的。Seam提供了一系列JSF组件标签和注解,增加了“web友好”和JSF应用的网页效率。

同时,Seam拓展了EJB3POJO的组件模式, web层到业务层都有了状态上下文。进一步说,Seam整合了一系列主要的其他开放源代码框架,例如jBPMJBoss Rules(又名Drools)JBoss PortalJBoss Microcontainer等等。Seam不仅能将它们“有机结合”起来,而且可以像整合JSFEJB3一样强化原有的框架。

Seam位于Java EE 5.0底层,但它的应用并不局限与Java EE 5.0服务器。一个Seam应用可以部署在J2EE 1.4应用服务器和Tomcat服务器上。这意味着现在能在Seam应用中得到产品化支持。

1.2   一个为ORM设计的Web框架

对象关系映射(ORM)解决方案在当今企业应用中广为使用。但是,大多数当前的业务和web框架并不是为ORM设计的,它们并不在整个Web交互生命周期从请求来临到响应完成??管理持久上下文。这就导致了包括可怕的LazyInitializationException在内的各种ORM异常,带来了如“数据传输对象(DTO)”等丑陋的伎俩(ugly hacks)。

Gavin King发明了Seam,同时他也发明了在世界上广为使用的ORM解决方案Hibernate。为了继承和发扬ORM的最佳实践,Seam进行了重新设计。有了Seam,就不必再写DTO,你所做的就是延迟加载。因为扩展后的持久上下文就如同一个自然的高速缓存,可以减少和数据库的交互,ORM的性能就会被极大地改进。

进一步讲,因为Seam整合了ORM层、业务层和表示层,开发者就能够在表示层直接展示ORM对象,也能把数据库验证注解用于输入表单,以及重新定向ORM例外到定制的错误页面。

1.3   专为有状态Web应用而设计

Seam是专为有状态Web应用而设计的。Web应用是天生的多用户应用,电子商务应用天生也是有状态的和有事务的。但是,大多数已有Web应用框架是面向无状态应用的。开发者必须操作HTTP会话(session)对象来管理用户状态,与核心业务逻辑无关的代码不仅会混乱你的应用,而且带来了一系列的性能问题。

Seam中,所有的基础应用组件天生地有状态。它们使用起来要比HTTP session容易,因为它们的状态由Seam公开管理。没有必要在Seam应用中编写引起麻烦的状态管理代码只需在其组件上注解其做用域、生命周期方法以及其他状态属性,Seam就会掌管其他[译者注:指这些组件的生命周期]Seam状态组件要比HTTP会话(session)能更好的管理用户状态。例如,你能有多个“会话”进行,每个“会话”由在一个HTTP会话(session)中一系列的Web请求和业务方法调用组成。

进一步说,在Seam中,数据库缓存和事务能自动与应用的状态相连。Seam在内存中自动保存数据库更新,等到对话结束后提交到数据库。内存中的缓存能大大减轻复杂状态应用中数据库的负载。

除了以上这些,Seam支持整合开源JBoss jBPM业务程序引擎,大大提升了Web应用中的状态管理。你现在能为一个机构中不同工作人员(诸如客户、经理、技术支持人员等等)的指定工作流程,利用工作流程来驱动应用,而不是依赖用户界面事件处理和数据库。

1.4   支持Web 2.0

SeamWeb2.0应用进行了充分的优化。它给AJAX(异步JavaScriptXML,增加网页交互的一种技术)提供了多种支持??从内置“零Javascript”的AJAX组件到有AJAX支持的JSF组件,再到定制的JavaScript库,Seam为浏览器端的Javascript对象提供了直接访问Seam服务器组件的途径。Seam提供了一个先进的并发模型,有效的管理来自同一用户的多个AJAX请求。

对于AJAX应用,不断增长的数据库负载是一个巨大的挑战。与一个非AJAX应用相比,一个AJAX应用要向服务器发送的更频繁的请求。一但数据库必须响应这些AJAX请求,那么数据库就不堪重荷。Seam中的状态持久上下文正如一个内存中的缓存,它能在会话始末保存信息,最终帮助减少数据库交互。

Web2.0应用往往为其数据使用复杂关系模型(例如,一个网络交际站点所做的就是处理和显示“用户”之间的关系),对于这些站点,延迟加载对于ORM层至关重要。否则,一个简单的查询就能级联地加载整个数据库。正如我们前面所讨论过的,Seam是现今唯一一个正确支持Web应用延时加载的Web框架。

1.5   依赖双向映射的Pojo服务

Seam是一个“轻量级”框架,因为它使用POJOplain old Java objects)作为服务组件。在应用中,POJO没有使用接口或抽象类来"钩住"组件。当然,问题是如何使POJO交互来组成这个应用?它们如何与容器服务(例如,数据库持久化服务)交互。

Seam通过使用一个流行的、被称作依赖注入(DI)的设计模式联结所有POJO组件。在这个模式下,Seam框架管理着所有组件的生命周期。当一个组件需要使用另外一个时,它通过注解(annotation)向Seam声明此依赖。Seam依据应用当前状态得到这个依赖组件,并将它注入到所需求的组件中。

通过拓展依赖注入概念,一个Seam组件A不但可以构造另外一个组件B,而且把此组件B“抛还”给Seam以备其他组件(例如组件C)以后使用。

1.6   避免滥用XML

Java注解在表述和处理Seam配置元数据时扮演着重要的角色。通过这样的设计使框架更易于操作。

J2EE发展早期,XML曾经被看作配置管理的“圣杯”。框架设计者将所有的配置信息,包括Java类和方法名称都统统丢进XML文档,而不考虑对开发者所带来的后果。反省后,发现这是个严重的错误。XML配置文档太过重复。开发者必须重复代码中已有的信息,从而将配置和代码联结起来。这些重复使应用易于出错(例如,一个拼写错误的类名可能在运行时显示为一个难于调试错误)。缺少合理的默认配置进一步使这一问题复杂化。事实上,在一些框架中,相当数量的样板代码伪装为XML,可能相当于或者超过实际应用中JAVA代码的数量。对于J2EE开发者,XML的滥用通常被称为“XML地狱”。

Java社区认识到了XML的滥用问题,并且已经非常成功地用Java代码中的注解取代了XMLEJB3Java官方标准化机构促进Java企业组件中注解使用的一项成果。EJB3完全可选择的使用XML文档,它向正确方向迈出了积极的一步。Seam加入了EJB3的注解,为整个web应用拓展了基于注解的编程模型。

当然,XML对于配置数据并非完全不利。Seam设计者认识到XML适用于指定页面流程或者定义业务流程的web应用。XML文档使开发者集中地管理整个web应用的工作流程成为可能,同时也反对将配置信息分散于java源文件中。工作流程很少能与源代码耦合,因此XML文档中并不需要重复键入已存在于代码中的信息。

 

这篇关于Seam技术分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/849384

相关文章

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

python中Hash使用场景分析

《python中Hash使用场景分析》Python的hash()函数用于获取对象哈希值,常用于字典和集合,不可变类型可哈希,可变类型不可,常见算法包括除法、乘法、平方取中和随机数哈希,各有优缺点,需根... 目录python中的 Hash除法哈希算法乘法哈希算法平方取中法随机数哈希算法小结在Python中,

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

Qt如何实现文本编辑器光标高亮技术

《Qt如何实现文本编辑器光标高亮技术》这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录实现代码函数作用概述代码详解 + 注释使用 QTextEdit 的高亮技术(重点)总结用到的关键技术点应用场景举例示例优化建议

关于MyISAM和InnoDB对比分析

《关于MyISAM和InnoDB对比分析》:本文主要介绍关于MyISAM和InnoDB对比分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录开篇:从交通规则看存储引擎选择理解存储引擎的基本概念技术原理对比1. 事务支持:ACID的守护者2. 锁机制:并发控制的艺