技术开发 频道

Spring 2.0集成Tapestry 5.0

   【IT168 技术文档】概述

   Tapestry是一个基于组件的Web框架,以至于用它开发Web应用和开发传统的GUI应用很类似。使用Tapestry开发Web应用时,你无须关注以操作为中心Servlet API,引用Tapestry网站上的一句话:“Tapestry用对象、方法、属性替代以往的URL和查询参数,重新诠释Web应用开发”。

   当前Tapestry的最新版本是5.0,新版本添加了很多新的功能,其中最让人感慨的是,Tapestry原有的IoC功能,现在已经越来越弱化,Tapestry将在不久将来完全放弃自身的IoC实现,转而使用Spring IoC。和Struts 2一样,Tapestry 5.0也专门提供了一个集成将Tapestry集成到Spring中的插件——对于Spring来说,越来越有“朵朵向阳开,高歌欢庆新春来”的气息了。

   Tapestry为集成Spring提供的类

   Tapestry 5.0提供了一个用于集成Spring中的tapestry-spring-5.0.x.jar类包,该类包中有三个重要的类,下面我们分别对此进行简单的说明。

   ·SpringObjectProvider:ObjectProvider的实现类,它从Spring容器中获取Bean;
   ·SpringBean:这是一个注解类,你可以在Tapestry类的属性变量或方法入参中标注该注解,这样Tapestry就会自动根据SpringObjectProvider从Spring容器中获取对应的Bean并完成动态注入;
   ·SpringModule:Tapestry使用该类保存Spring容器的引用,确切地说它包含了WebApplicationContext实例的引用。

   SpringObjectProvider

   我们知道Tapestry拥有一套自己的IoC实现,其中org.apache.tapestry.ioc.ObjectProvider是Tapestry IoC的重要接口,它相当于Spring的BeanFactory,负责创建并返回Bean的实例。SpringObjectProvider实现了ObjectProvider接口,它不去亲自创建Bean实例,相反它通过访问Spring容器获得Bean实例。
代码清单 4 SpringObjectProvider package org.apache.tapestry.spring; … public class SpringObjectProvider implements ObjectProvider { … public SpringObjectProvider(Log log, @InjectService("WebApplicationContext") WebApplicationContext context) ①通过Tapestry的基础设施注入Spring容器引用 { _log = log; _context = context; } private synchronized void loadBeanNames() { … } public <T> T provide(Class<T> objectType, AnnotationProvider annotationProvider, ObjectLocator locator) ② 从Spring容器中获取Bean { SpringBean annotation = annotationProvider.getAnnotation(SpringBean.class); if (annotation == null) return null; String beanName = annotation.value(); Object raw = _context.getBean(beanName, objectType); return objectType.cast(raw); } }

   该类在实例化时,Tapestry框架会将Spring容器的WebApplicationContext引入传递进来,通过
   ①处的构造函数你可以清楚地看到这点。
   ②处的方法是ObjectProvider接口的方法,这个方法看起来挺奇怪,这是因为Tapestry 5.0已经不采用基于XML的配置机制,相反它采用JDK 5.0注解的机制直接在类中通过注解进行装配。如果Tapestry组件类的属性或方法入参需要使用Spring容器的Bean进行注入,只需要标注上@SpringBean就可以了,Tapestry框架通过扫描组件类,为所有标注了@SpringBean的属性或入参注入Spring中的Bean。由于@SpringBean包含了Bean的名字,而被标注的属性或入参提供了对象的类型,这样SpringObjectProvider就可以按“名字+类型”获取Spring中相应的Bean了。

0
相关文章