SpringBean是一个标准的JDK 5.0注解类,用于标注Tapestry组件类的成员变量和方法入参,为Tapestry框架提供元数据信息,以便使用Spring容器中的Bean对标注对象进行依赖注入。
package org.apache.tapestry.spring; … @Target({ FIELD, PARAMETER }) ①可以用于标注成员变量和方法入参 @Documented @Retention(RUNTIME) public @interface SpringBean { String value(); ②可以通过值指定需要注入的Bean名称 }
SpringModule
SpringModule从ServletContext中获取WebApplicationContext,并将SpringObjectProvider注册为ObjectProvider的实现类,SpringModule将作为Tapestry的一个基础设施。
package org.apache.tapestry.spring; import org.apache.tapestry.ioc.ObjectProvider; import org.apache.tapestry.ioc.OrderedConfiguration; import org.apache.tapestry.ioc.ServiceBinder; import org.apache.tapestry.ioc.annotations.InjectService; import org.apache.tapestry.services.Context; public class SpringModule { public static void bind(ServiceBinder binder) { ①将SpringObjectProvider作为ObjectProvider的实现类 binder.bind(ObjectProvider.class, SpringObjectProvider.class) .withId("SpringObjectProvider"); } ②注入Tapestry的Context(是Tapestry为ServletContext提供的别名类) public static WebApplicationContext build(@InjectService("Context") Context context) { WebApplicationContext springContext = (WebApplicationContext) context .getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_A return springContext; } … }
Tapestry将这些类打包在tapestry-spring-5.0.x.jar中,该JAR包中有一个MANIFEST.MF标明文件,文件中通过以下语句指定了Tapestry的模块类:
Tapestry-Module-Classes: org.apache.tapestry.spring.SpringModule
这样,在Tapestry启动时,SpringModule类自动被初始化,并注入Tapestry的Context实例(其实就是ServletContext),这样SpringModule实例就包含Spring容器的引用了。
在了解了Tapestry为集成Spring做了哪些准备后,下面我们将开始讨论如何通过具体配置集成Spring,让Tapestry的组件类通过注解引用Spring的Bean。