选择seam并不代表要放弃spring, 两者并不互斥,相反,可以很好的协作。seam对spring提供了很好的兼容性。那么在seam里如何使用spring里的代码呢?
POJO代码的重用
正如spring管理的bean是POJO一样,seam管理的组件,也是POJO的,而且连ejb3也是POJO的,所以直接的重用以前用在spring 里的代码的方法,就是直接重用POJO了。以前我们就applicationContext.xml来配置bean,现在只需要换一个语法就能把 spring的POJO bean变成seam的component。例如,对于spring的bean:
<bean id="testBean" class="org.test.TestBean">
<property name="stringProperty" value="this is a string" />
<property name="intProperty" value="3" />
<property name="anotherBean" ref="anotherBean" />
</bean>
对应到seam里就是:
<component name="testBean" class="org.test.TestBean">
<property name="stringProperty">this is a string</property>
<property name="intProperty">3</property>
<property name="anotherBean">#{anotherBean}</property>
</component>
大部分的POJO可能这就可以搞定了。但是要注意:
假如这个POJO依赖于spring容器,比如它实现了spring的bean生命周期回调方法,类似于 afterPropertiesSet() , 那么你也得让seam去模仿spring容器,在适应的时候,去调用这些回调方法。比如:
public class TestBeanAdapter extends TestBean {
@Create
public void afterPropertiesSet() {
super.afterPropertiesSet();
}
}
通JSF EL Resolver来桥接
只要实现了EL Resolver, 并在faces-config.xml里注册它,那么在JSF里使用EL表达式时,就会自动地调用EL Resolver来寻找这个EL表达式对应的对象等。seam当然实现了它自己的Resolver,而spring也实了这个Resolver,如果把它们都注册上,那么JSF EL 将变成seam与spring的一座桥梁。用下面代码注册spring EL Resolver:
<faces-config>
<application>
<el-resolver>
org.springframework.web.jsf.el.SpringBeanFacesELResolver
</el-resolver>
</application>
</faces-config>
如果你定义了spring bean testBean, 那么在seam组件里,你就可以通过 @In("#{testBean}") 来注入spring的bean。但是要记住,这种方法获得的对象,完全是由spring负责组装的地地道道的spring的bean, 所以它不具有seam component具有功能,比如双向注入,和seam的上下文完美一体,延长的持久化上下文(extended persistence context)。
seam里的spring
最完美的方案,我想你也想到了,就是让seam来管理spring容器,并加入seam的增强功能。这是可以做得到的,并且已经做到了,感谢spring的灵活性,和seam开发者们的努力。像下面那样在conponents.xml里加入spring名称空间:
<components xmlns="http://jboss.com/products/seam/components"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:spring="http://jboss.com/products/seam/spring"
xsi:schemaLocation="
http://jboss.com/products/seam/components
http://jboss.com/products/seam/components-2.0.xsd
http://jboss.com/products/seam/spring
http://jboss.com/products/seam/spring-2.0.xsd">
<!-- component declarations -->
</components>
现在你可以在components.xml里使用<spring:context-loader />了:
<spring:context-loader>
<spring:config-locations>
<value>classpath:spring-beans-persistence.xml</value>
<value>classpath:spring-beans-service.xml</value>
</spring:config-locations>
</spring:context-loader>
好了,现在当你启动seam时,seam便会到你指定的位置去寻找spring的配置,并起动一个spring容器。为了能让seam知道要如何增强 spring里的bean,我们需要在spring那边做一些手脚。在spring的配置文件里加入seam的名称空间如下:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:seam="http://jboss.com/products/seam/spring-seam"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://jboss.com/products/seam/spring-seam
http://jboss.com/products/seam/spring-seam-2.0.xsd">
<!-- bean definitions -->
</bean>
这样,你就可以在spring的配置文件里使用以下三种元素来定义如何增强spring bean了:
1. <seam:conponent /> 把一个spring bean变成seam component
2. <seam:instance> 向一个spring bean里注入seam component
3. <seam:configure-scopes> 定义一些默认的配置
看看下面的使用举例,我想你根本不需要解释就明白了:
<bean id="aBean" class="org.test.TestBean" scope="prototype">
<property name="aString" value="a string" />
<seam:component name="testBean" scope="CONVERSATION" auto-create="true" />
</bean>
<bean id="anotherBean" class="org.test.AnotherBean" scope="prototype">
<property name="aBean">
<seam:instance name="testBean" />
</property>
</bean>
<seam:configure-scopes default-auto-create="true"/>
spring的 aBean在seam里被叫做 testBean, 并且它在 conversation scope里,spring的anotherBean在创建它时,会把testBean注入进去。非常简单吧?
但是,在使用过程中,要注意,seam不能对spring通过jdk 动态代理增强过的类进行再增强,所以如果要让一个spring的bean参予到seam里来,就不要对它使用动态代理的方式来实现AOP,你需要在spring的配置文件里做如下配置:
<aop:config proxy-target-class="true">
......
</aop:config>
好了,至此,在seam中使用spring的方法就介绍完了。
分享到:
相关推荐
在Spring中,使用SeamComponent注解来注入Seam组件。 7. **测试和调试**:确保所有组件都能正常启动并协同工作,进行单元测试和功能测试。 这个配置过程可能因具体需求和项目结构有所不同,但以上步骤提供了一个...
在Spring 2.5中,引入了更强大的注解支持,使得无需XML配置就能完成组件的装配,大大提高了开发效率。此外,还增强了对JSR-303(Java Bean Validation)的支持,提供了一种标准的方式来验证对象属性。 Hibernate...
除了JBPM(一个用于业务流程管理的工具)之外,Seam还支持与其他常用的工具和组件如Spring、邮件发送、权限管理等进行集成,从而增强应用的功能。 #### 三、Seam框架的功能与特点 ##### 1. 一站式(FullStack)的...
在实际开发中,Seam注解和标签的结合使用可以极大地简化代码,提高开发效率。例如,通过`@Name`和`@In`注解,可以轻松地管理依赖关系;利用`@Entity`和`@Table`注解,可以方便地实现数据持久化;而`<s:form>`和`s:...
- **推模式MVC**:讨论了如何在RESTful应用中使用Seam的“推送”模式实现更复杂的MVC交互。 ##### 2.10 在JBoss上运行Seam示例 - **使用JSF 1.2 RI**:提供了如何在JBoss平台上使用JSF 1.2参考实现来部署和运行...
这篇博文可能会详细解析Seam的关键特性和实际应用场景,以及如何在项目中有效地利用Seam提升开发效率。 通过学习Seam,开发者不仅可以掌握一种高效的开发工具,还能深入了解Java EE的内在工作原理。Seam的源码分析...
在Seam中,这可能涉及到使用Seam的导航规则和事件驱动的页面管理,帮助开发者实现动态和灵活的Web界面。 4. **security**:这部分源码可能展示了Seam的安全特性,如身份验证、授权和会话管理。Seam集成了Spring ...
Seam 2.0 是一个全面的Java EE框架,它为开发人员提供了一种整合多种技术,如JavaServer Faces (JSF)、Enterprise JavaBeans (EJB)、Java Persistence API (JPA)以及Spring等的强大工具。这个"Seam_2.0_Reference_zh...
- **JSF和Seam的集成**:讲解如何在JSF页面中使用Seam组件,以及如何绑定JSF组件到业务逻辑。 - **持久性**:详细阐述Seam如何与JPA集成,以及如何进行数据访问和对象关系映射。 - **安全性**:描述Seam的安全特性和...
它将这些复杂性完全封装起来,避免了Spring中常见的手动事务管理与数据库访问问题。Seam的这种全栈式框架特性使得它可以隐藏这些底层实现,减轻了开发者的负担。 另外,Seam对第三方框架的集成深度令人印象深刻。...
开发者可以选择使用Spring来进行依赖注入和服务层的开发,Seam与Spring的结合为开发者提供了更多的选择和灵活性。 #### 附录 - **附录A. Seam入门套件** - **附录B. Seam注解快速参考** - **附录C. JSF组件库** ...
1.3. Seam 中的可点击列表:消息示例............................................................................................................................. 27 1.3.1. 理解代码.........................
- **JSF组件库**:Seam与JSF紧密集成,书中还介绍了如何使用各种JSF组件库来增强应用程序的界面表现力。 综上所述,《Manning - Seam in Action》不仅是一本介绍Seam框架的书籍,它还深入探讨了如何利用Seam来解决...
**深入浅出-JBoss Seam详解** JBoss Seam是一款开源的企业级Java框架,它结合了...然而,随着Spring Boot和Quarkus等轻量级框架的兴起,Seam的使用在近年来有所减少,但它仍不失为学习企业级Java开发的一个重要参考。
此外,书中可能还会涵盖Seam与其他技术如Spring、Hibernate、RichFaces等的协同工作,以及如何利用Seam进行企业级应用的性能优化。 总的来说,《Seam In Action》翻译版是学习和掌握Seam框架的重要参考资料,对于想...
- **使用 EJB3 Beans**:在 Seam 中,开发者可以直接在 EJB3 Beans 中定义方法来响应来自 JSF 页面的事件。这种方式避免了需要编写额外的 BackingBeans 来处理 UI 事件的情况,使得代码更加简洁易维护。 - **POJOs ...
在实际开发中,Seam的使用涵盖了从创建简单的Hello World程序到构建复杂的业务流程驱动的应用。例如,通过Seam,开发者可以轻松实现RESTful服务,使得HTTP GET和POST操作都能得到妥善处理。此外,Seam与jBPM的集成...
droolsjbpm-integration, Drools和jBPM与 seam,spring,camel的集成. . 开发口水和 jBPM如果你想要构建或者贡献到一个项目,则阅读这里文档 。 我们将通过正确设置开发环境来节省你和我们大量的时间。 它解决了所有...