...
In Tapestry any annotation can be a marker annotation. You don’t need to place something like the @Qualifier annotation on your marker annotation.
Method Injection
Injectable methods is a next slight difference. In JSR-330 a method is injectable if the @Inject annotation is present. In Tapestry the @Inject annotation is optional. An ordinary setter method is a candidate to perform injection.
Code Block |
---|
public class Car {
private Engine engine;
public void setEngine(Engine engine) {
this.engine = engine;
}
} |
When building a Car instance, Tapestry IoC will try to resolve a service of type Engine. If available, Tapestry will perform injection by invoking the setter method.
Besides that, module methods are injectable. Again, there is no need to mark the methods with @Inject annotation as Tapestry explicitly knows which module methods to invoke. In the following example you can see how to use @Named annotation to inject a service by id into a contribute method.
Code Block |
---|
public class TapestryModule {
@Contribute(BindingSource.class)
public static void provideBindings(
MappedConfiguration<String, BindingFactory> cfg,
@Named("PropBindingFactory")
BindingFactory propBindingFactory,
@Named("MessageBindingFactory")
BindingFactory messageBindingFactor ) {
cfg.add(BindingConstants.PROP,
propBindingFactory);
cfg.add(BindingConstants.MESSAGE,
messageBindingFactory);
}
...
} |
Scopes
By default, a JSR-330 injector creates an instance, uses the instance for one injection, and then forgets it. By placing the @Scope annotation you can tell the injector to retain the instance for possible reuse in a later injection. If you want a service to be a singleton, you need to use the @Singleton annotation.
...