Injection
...
is Tapestry's way of making a dependency – such as a resource, asset, component, block or service – available in a page, component, mixin or service class.
Div | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
|
Injection is a key concept in Tapestry, and it is used in several different but related ways, listed below.
Injection in Tapestry IOC Services
Main Article: Injection in Detail
Wiki Markup |
---|
{float:right|background=#eee}
{contentbylabel:title=Related Articles|showLabels=false|showSpace=false|space=@self|labels=injection}
{float} |
A key concept in Tapestry is the use of injection. The term Injection in Tapestry is used in several related ways. The Tapestry IoC container makes use of one form of injection , primarily through constructors and via parameters to service builder methods (see .
Injection in
...
Component Classes
For components, however, Tapestry takes a completely different tack: injection directly into instance variablescomponent fields.
@Inject Annotation
The @Inject annotation is used to identify fields that will contain injected services and other resources.
Tapestry allows for two kinds of injection:
...
- Default injection, where Tapestry determines the object to inject into the field based on its type.
- Explicit injection, where the particular service to be injected is specified.
In both cases, the field is transformed into a read only value. As elsewhere in Tapestry, this transformation occurs at runtime (which is very important in terms of being able to test your components). Attempting to update an injected field will result in a runtime exception.
In addition, there are a few special cases that are triggered by specific field types, or additional annotations, in addition, to @Inject, on a field.
Asset Injection
When the @Path annotation is also present, then the injected value (relative to the component) will be a localized asset.
Symbols in the annotation value are expanded.
Block Injection
For field type Block, the value of the Inject annotation is the id of the <block> <t:block> element within the component's template. Normally, the id of the block is determined from the field name (after stripping out any leading "_" and "$" characters). :
Code Block | ||||
---|---|---|---|---|
| ||||
@Inject
private Block foo;
|
Where that is not appropriate, an @Id annotation can be supplied:
Code Block | ||
---|---|---|
java | java | @Inject private Block foo; @Inject @Id("bar") private Block barBlock; |
The first injection will inject the Block with id "foo" (as always, case is ignored). The second injection will inject the Block with id "bar".
...
A very common example occurs when a component needs access to its resources. The component can define a field of the appropriate type and use the @Inject
annotation without a value:
Code Block | ||||
---|---|---|---|---|
| ||||
@Inject
private ComponentResources resources;
|
...
- org.apache.tapestry5.ioc.Messages – The component message catalog for the component, from which localized messages can be generated.
Asset Injection
Main Article: Assets
When the @Path annotation is also present, then the injected value (relative to the component) will be a localized asset.
Code Block | ||||
---|---|---|---|---|
| ||||
@Inject
@Path("context:images/top_banner.png")
private Asset banner;
|
Symbols in the annotation value are expanded.
Service Injection
Here, a custom EmployeeService service is injected, but any custom or built-in service may be injected in the same way.
Code Block | ||||
---|---|---|---|---|
| ||||
@Inject
private EmployeeService employeeService;
|
A large number of services are provided by Tapestry. See the following packages:
Wiki Markup |
---|
{float:left|width=15em}
* [Core Services|http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/package-summary.html]
* [AJAX Services|http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/ajax/package-summary.html]
* [Assets Services|http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/assets/package-summary.html]
* [Dynamic Component Services|http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/dynamic/package-summary.html]
{float} |
Wiki Markup |
---|
{float:left|width=15em}
* [JavaScript Services|http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/javascript/package-summary.html]
* [Link Transformation Services|http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/linktransform/package-summary.html]
* [Message Services|http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/messages/package-summary.html]
* [Component Metadata Services|http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/meta/package-summary.html]
{float} |
Wiki Markup |
---|
{float:left|width=15em}
* [Page Loading Services|http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/pageload/package-summary.html]
* [Security Services|http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/security/package-summary.html]
* [Template Services|http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/templates/package-summary.html]
* [Class Transformation Services|http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/services/transform/package-summary.html]
{float} |
Wiki Markup |
---|
{float:left|width=15em}
* [Tapestry IOC Services|http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/services/package-summary.html]
* [Tapestry IOC Cron Services|http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/ioc/services/cron/package-summary.html]
* [Kaptcha Services|http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/kaptcha/services/package-summary.html]
* [File Upload Services|http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/upload/services/package-summary.html]
{float} |
HTML |
---|
<div style="clear:both"></div> |
Explicit Service Injection
Here, a specific object is requested. A @Service annotation is used to identify the service name.
Example:
Code Block | ||||
---|---|---|---|---|
| ||||
@Inject
@Service("Request")
private Request request;
|
This is generally not necessary; you should always be able to identify the service to be injected just by type, not by explicit id. Explicit ids have the disadvantage of not being refactoring-safe: this won't happen with the Request service, but perhaps in your own code ... if you rename the service interface and rename the service id to match, your existing injections using the explicit service id will break.
...