使用JSR 330标准注释

在5.3中增加
JSR-330注释可以在Tapestry 5.3和更高版本中用于注入。

相关文章

下表说明Tapestry IoC和JSR-330中的大多数注释是可互换的。然而,在语义上几乎没有差异。

JSR-330型
javax.注入

挂毯
org.apache.tapestry5.ioc.annotations网站

注释

@注入

@注入

-

@注入
@命名

@注入服务

-

@范围

@范围

-

@限定符

-

Tapestry标记注释不需要任何限定符注释

@辛格尔顿

-

默认情况下,所有Tapestry服务都是单一的

现场注入

让我们从现场注入开始。在Tapestry中,对字段的注入是由@注入@注入服务注释。当字段上存在@Inject注释时,Tapestry会尝试根据字段的类型解析要注入的对象。如果同一服务接口的多个实现在注册表中可用,则必须消除要注入哪个实现的歧义。这可以通过放置@注入服务注入点上的注释。

导入org.apache.tapestry5.ioc.annotations。注入;导入org.apache.tapestry5.ioc.annotations。注入服务;...公共类AuthenticationFilter实现ComponentRequestFilter{@注入服务(“HttpBasic”)私有身份验证服务basicAuthService;@注入服务(“HttpDigest”)private AuthenticationService digestAuthService;@注入私人响应;...}

现在,让我们看看相同服务的JSR-330等价物。正如您所见,@Inject注释是可互换的。区别在于如何通过服务的唯一id获取服务。为此,JSR-330提供了@命名伴随@Inject注释的注释。

导入javax.inject。注入;导入javax.inject。命名;...公共类AuthenticationFilter实现ComponentRequestFilter{@注入@Named(“HttpBasic”)私有身份验证服务basicAuthService;@注入@Named(“HttpDigest”)private AuthenticationService digestAuthService;@注入私人响应;...}

构造器注入

对于构造函数注入,@Inject注释是可互换的。您可以使用JSR-330或Tapestry注释来标记要注入的构造函数。注意,每个类最多可以有一个构造函数标记为注入点。

然而,构造函数注入在JSR-330和Tapestry IoC中的语义不同。在JSR-330中,只有当@Inject注释存在时,构造函数才是可注入的。

公共级轿车{公共Car(){…}@注入公共汽车(发动机){…}}

在Tapestry中,构造函数的@Inject注释是可选的。所有可用的构造函数都是注入的候选:将调用参数最多的构造函数。

公共级轿车{公共Car(){…}公共汽车(发动机){…}}

如果有几个构造函数可用,并且您不希望具有大多数参数的构造函数是可注入的,则需要将@注入注释。

公共级轿车{公共Car(){…}@注入公共汽车(发动机){…}公共汽车(发动机、记录器记录器){…}}

注入页面和组件

在Tapestry组件中,注入只发生在字段上。到目前为止,注射是由@注入@注入服务注释。从5.3版本开始,注入点也可以用JSR-330注释进行标记。下面的示例演示了这一点。

公共类索引{@注入私人请求请求;@javax.注入。注入私有组件资源;@javax.注入。注入@命名(“法语问候语”)私人迎宾员;@javax.注入。注入@符号(SymbolConstants.PRODUCTION_MODE)私有布尔productionMode;无效onActivate(){…}}

标记/限定符注释

JSR-330和Tapestry IoC都允许您通过标记或限定符注释来消除服务的歧义,如以下示例所示。

公共类索引{@注入@法语私人迎宾员;}

再一次,两者略有不同。在JSR-330中,类似于@法语在上面的示例中,需要用@限定符注释。

@已记录@保留(RetentionPolicy.RUNTIME)@目标(ElementType.FIELD)@javax.注入。限定符public@interface法语{}

在Tapestry中,任何注释都可以是标记注释。你不需要放置类似@限定符标记注释上的注释。

方法注入

注射方法是另一个细微的区别。在JSR-330中,如果存在@Inject注释,则方法是可注入的。在Tapestry中,@Inject注释是可选的。普通的setter方法是执行注入的候选方法。

公共级轿车{专用引擎;public void setEngine(引擎引擎){this.engine=发动机;}}

构建时小型车实例,Tapestry IoC将尝试解析类型为的服务发动机。如果可用,Tapestry将通过调用setter方法执行注入。

除此之外,模块方法是可注射的。同样,没有必要用@Inject注释标记这些方法,因为Tapestry明确知道要调用哪些模块方法。在下面的示例中,您可以看到如何使用@命名通过id将服务注入贡献法

公共类TapestryModule{@贡献(BindingSource.class)公共静态无效提供绑定(MappedConfiguration<String,BindingFactory>cfg,@命名(“PropBindingFactory”)绑定工厂propBindingFactory,@命名(“MessageBindingFactory”)绑定工厂消息绑定因子){cfg.add(绑定常量.PROP,propBindingFactory);cfg.add(BindingConstants.MESSAGE,消息绑定工厂);}...}

范围

默认情况下,JSR-330注入器创建一个实例,使用该实例进行一次注入,然后忘记它@范围注释,您可以告诉注入器保留实例,以便在以后的注入中重用。如果希望服务是单例的,则需要使用@辛格尔顿注释。

在Tapestry中,情况正好相反。默认情况下,服务是单例的。创建实例后,它将被重用以进行注入。另一个可用范围是细丝,主要用于帮助多线程servlet应用程序。如果服务具有细丝范围中,将为每个传入请求重新创建它。