Seam是一个组件化的框架,它可以很方便的,把随意的类发布面向为组件(通过注释Name("name"))。面向组件,这里组件是一个很重要的概念,Seam中深度整合了EJB,但,也可以在非EJB环境下使用。以下是,在SEAM中存在的几种组件。
- 无状态的会话BEAN:EJB的Session Bean它用注释@Stateless来做来配置。不能为JSF提供属性,只能做listenter,这里只允许用@in注入及用Component.getInstance()来获得一个实例。
- 有 状态的会话BEAN:EJB的Session Bean,用@Stateful来做配置。默认情况下在CONVERSATIO上下文中,线程安全,并发做串行运行,可以用做JSF提供属性,当然也能做 listenter,这里只允许用@in注入及用Component.getInstance()来获得一个实例。
- Entity BEAN:实体Bean,可以做对象的持久化,也可以做为组件发布,但在并发情况下性能比较的差,不能被用在无状态的上下文中。
- Java Bean:为了在非EJB运行环境下使用。
- 消息驱动的Bean:这是EJB中一个重要的Bean,和JMS一起使用。
因为Seam管理着组件的生命周期,所以它有能力对这个组件在生命周期中的几个点进行拦截,一般在架构一个系统时才会用到,我将在下次再深入的去学习他。
每一个组件都可以有自己的做用域(注释Scope),作用域的定义是放在ScopeType的枚举中,以下是几种作用域。虽然在一般性况下一个组件只有一 个作用域,但也可以通过角色这种方式来定义多种的作用域。每一个有状态的BEAN都有一个可以有生命周期的回调,如@PostConstruct 和 @PreDestroy,在这里也有一个麻烦的地方,那就是有态的Bean都需要一个@remove的注释方法。
- STATELESS:无状态的组件
- METHOD:这个我不是很理解,以下是英文
The method context. Each call to a session bean or JavaBean component puts a new method context onto the stack of method contexts associated with the current thread. The context is destroyed (and the stack popped) when the method returns. - EVENT:每一次request请求
- PAGE:同一个页面的多次请求,序列化请求到页面。
- CONVERSATIO:很重要的特性可是没有办法理解
- SESSION:很基本不解释了
- APPLICATION:基本概念
- BUSINESS_PROCESS:在一个流程会话,可以在多个用户中流
双向注入,在SEAM中是一个很重要的概念,我看了文档,但没能完全理解双向注入的概念,在SEAM中可以将上下文中的组件注入到组件中这叫@IN注入, 还可以反向的注回上下文中叫做@out。IN的注入比较好理解,和IOC有点相似,只是因为这个组件都是有状态的,所以,他注入的组件,只有在触发这个组 件时才发生注入,但是out注入,我就没有办法理解了。