看到 Shale 的 Spring Integration 文档的介绍原理,其中顺序如下:
When asked to resolve a variable name, the following algorithm is performed:
1.Does a bean with the specified name already exist in some scope (request, session, application)? If so, return it.
2.Is there a standard JavaServer Faces managed bean definition for this variable name? If so, invoke it in the usual way, and return the bean that was created.
3.Is there configuration information for this variable name in the Spring WebApplicationContext for this application? If so, use it to create and configure an instance, and return that instance to the caller.
4.If there is no managed bean or Spring definition for this variable name, return null instead.
这样的话,只要 Spring 可以控制 Bean 的 Scope 的话,就可以把 Managed-Bean 的配置放到 Spring Bean 里来配置,一方面,我们可以省去了 JSF 的 Managed Bean 的配置,另外的话,我们可以对 JSF 的 Backing Bean 使用 AOP 以及 Spring 提供的很多功能。过去在 JSF-Spring 中尝试着去控制 Spring Bean 的 Scope,但是做的并不好,现在 Spring 2.0 给我们提供了这样的能力,经过实验,证明了这样是可行的。
不过如果使用 Spring Bean 以后,会造成使用 Managed Bean 的 JSTL 无法使用,其实 JSTL 本身用起来就时好时坏的,所以影响并不太大了。
整合起来步骤非常的简单:
1. 把 Spring 2.0 的 jar 文件放到 lib 下面,当前使用的是 Spring 2.0 RC3
2. 因为使用的是 Servlet 2.4,所以要在 web.xml 中加入
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
3. 修改 applicationContext.xml
注释或删掉以下内容:
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"
http://www.springframework.org/dtd/spring-beans.dtd
">
修改 <beans> 为:
<beans xmlns="
http://www.springframework.org/schema/beans
"
xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance
"
xmlns:aop="
http://www.springframework.org/schema/aop
"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
">
4. 然后就可以按照配置 Spring Bean 的方式来配置 Managed Bean:
这个是 Request Scope 中的 Bean:
<bean id="loginBean" class="org.agilejava.icustomer.backingbean.LoginBean"
scope="request" autowire="byName">
<aop:scoped-proxy/>
</bean>
这个是 Session Scope 中的 Bean:
<bean id="menuBean" class="org.agilejava.framework.commons.menu.MenuBackingBean"
scope="session" autowire="byName">
<aop:scoped-proxy/>
</bean>
虽然短期来看,配置上会少写了一些,因为 autowire="byName",但是从长远来看,我们可以利用 Spring 的更多功能,比如 AOP 来增强 Backing Bean 的能力,我的第一个设想就是用 AOP 来处理 Backing Bean 中的异常,今后几天我会继续做这方面的实践了。
posted on 2006-09-05 10:16
steady 阅读(3573)
评论(2) 编辑 收藏 所属分类:
JSF & Myfaces