blob: 3fcaf8c75440aaa9e32664f086b11fa6c33e658f [file] [log] [blame]
<!DOCTYPE html>
<!--
| Generated by Apache Maven Doxia Site Renderer 2.0.0 from src/site/xdoc/howto/annotations.xml at 10 Sep 2025
| Rendered using Apache Maven Fluido Skin 2.1.0
-->
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="generator" content="Apache Maven Doxia Site Renderer 2.0.0" />
<title>Annotations Howto – Apache Turbine</title>
<link rel="stylesheet" href="../css/apache-maven-fluido-2.1.0.min.css" />
<link rel="stylesheet" href="../css/site.css" />
<link rel="stylesheet" href="../css/print.css" media="print" />
<script src="../js/apache-maven-fluido-2.1.0.min.js"></script>
<link rel="icon" type="image/png" sizes="48x48" href="https://apache.org/favicons/favicon.ico">
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<style>.github-fork-ribbon:before { background-color: orange; }</style>
</head>
<body>
<a class="github-fork-ribbon right-top" href="https://github.com/apache/turbine-build" data-ribbon="Fork me on GitHub">Fork me on GitHub</a>
<div class="container-fluid container-fluid-top">
<header>
<div id="banner">
<div class="pull-left"><div id="bannerLeft"><h1><a href="https://turbine.apache.org/"><img src="https://www.apache.org/img/feather_glyph_notm.png" style="width: 50px;" /> The Apache Turbine project</a></h1></div></div>
<div class="pull-right"><div id="bannerRight"><h1><a href="https://turbine.apache.org/"><img src="https://turbine.apache.org/images/logo.gif" alt="Apache Turbine" /></a></h1></div></div>
<div class="clear"><hr/></div>
</div>
<div id="breadcrumbs">
<ul class="breadcrumb">
<li id="publishDate">Last Published: 01 Apr 2025<span class="divider">|</span>
</li>
<li id="projectVersion">Version: 7.1-SNAPSHOT</li>
<li class="pull-right"><span class="divider">|</span>
<a href="https://turbine.apache.org/fulcrum/">Fulcrum</a></li>
<li class="pull-right"><span class="divider">|</span>
<a href="https://turbine.apache.org/">Turbine</a></li>
<li class="pull-right"><a href="https://www.apache.org">Apache</a></li>
</ul>
</div>
</header>
<div class="row-fluid">
<header id="leftColumn" class="span2">
<nav class="well sidebar-nav">
<ul class="nav nav-list">
<li class="nav-header">General Information</li>
<li><a href="../index.html">Overview</a></li>
<li><a href="../features.html">Features</a></li>
<li><a href="../fsd.html">Specification</a></li>
<li><a href="../getting-started.html">Getting Started</a></li>
<li><a href="../how-to-build.html">Howto Build Turbine</a></li>
<li><a href="../changes-report.html">Changes</a></li>
<li class="nav-header">Documentation</li>
<li><a href="../services/index.html"><span class="icon-chevron-right"></span>Services</a></li>
<li><a href="../howto/index.html"><span class="icon-chevron-down"></span>Howtos</a>
<ul class="nav nav-list">
<li><a href="../howto/action-event-howto.html">Action Events Howto</a></li>
<li class="active"><a>Annotations Howto</a></li>
<li><a href="../howto/configuration-howto.html">Configuration Howto</a></li>
<li><a href="../howto/extend-user-howto.html">Extend User Howto</a></li>
<li><a href="../howto/hibernate-howto.html">Hibernate OM Howto</a></li>
<li><a href="../howto/intake-howto.html">Intake Howto</a></li>
<li><a href="../howto/jsp-howto.html">JSP Howto</a></li>
<li><a href="../howto/migrate-from-2_1-howto.html">Migrating from 2.1 to 2.2</a></li>
<li><a href="../howto/migrate-from-2_2-howto.html">Migrating from 2.2 to 2.3</a></li>
<li><a href="../howto/migrate-from-2_3-howto.html">Migrating from 2.3 to 4.0</a></li>
<li><a href="../howto/migrate-from-4_0-howto.html">Migrating from 4.0 to 5.0</a></li>
<li><a href="../howto/pullmodel-howto.html">Pull Model Howto</a></li>
<li><a href="../howto/python-howto.html">Python Howto</a></li>
<li><a href="../howto/security-howto.html">Security Howto</a></li>
<li><a href="../howto/services-howto.html">Services Howto</a></li>
<li><a href="../howto/url-mapper-howto.html">URL Mapper Howto</a></li>
<li><a href="../howto/url-rewriting-howto.html">URL Rewriting Howto</a></li>
<li><a href="../howto/context-howto.html">Velocity Context Howto</a></li>
<li><a href="../howto/velocity-site-howto.html">Velocity Site Howto</a></li>
<li><a href="../howto/velocityonlylayout-howto.html">VelocityOnlyLayout Howto</a></li>
</ul></li>
<li><a href="https://cwiki.apache.org/confluence/display/TURBINE">Wiki</a></li>
<li><a href="../apidocs/index.html">JavaDocs</a></li>
<li class="nav-header">Development</li>
<li><a href="../proposals.html">Proposals</a></li>
<li><a href="../how-to-help.html">How To Help</a></li>
<li><a href="../todo.html">Todo</a></li>
<li class="nav-header">Project Documentation</li>
<li><a href="../project-info.html"><span class="icon-chevron-right"></span>Project Information</a></li>
<li><a href="../project-reports.html"><span class="icon-chevron-right"></span>Project Reports</a></li>
<li class="nav-header">Apache</li>
<li><a href="https://www.apache.org/">Apache Website</a></li>
<li><a href="https://www.apache.org/licenses/">License</a></li>
<li><a href="https://www.apache.org/foundation/how-it-works.html">How the ASF works</a></li>
<li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
<li><a href="https://www.apache.org/foundation/thanks.html">Thanks</a></li>
<li><a href="https://www.apache.org/security/">Security</a></li>
</ul>
</nav>
<div class="well sidebar-nav">
<form id="search-form" action="https://www.google.com/search" method="get" >
<input value="http://turbine.apache.org/turbine/turbine-7-0" name="sitesearch" type="hidden" />
<input class="search-query" name="q" id="query" type="text" placeholder="Search with Google..." />
</form>
<div id="poweredBy">
<div class="clear"></div>
<div class="clear"></div>
<a href="https://maven.apache.org/" class="builtBy" target="_blank"><img class="builtBy" alt="Built by Maven" src="../images/logos/maven-feather.png" /></a>
</div>
</div>
</header>
<main id="bodyColumn" class="span10">
<section><a id="Annotations"></a>
<h1>Annotations</h1>
<p>
Turbine provides a number of annotations to inject dependencies into your actions,
screens and layouts. All <code>Assemblers</code> that is, all modules of type
<code>Action</code>, <code>Screen</code>, <code>Layout</code>, <code>Page</code>,
<code>Navigation</code> and <code>ScheduledJob</code> as well as all
<code>Valves</code> in the pipeline support the injection of services,
configurations and loaders. This relieves you from the burden of looking
them up at runtime and thus simplifies and accelerates the code.
</p>
<section><a id="a.40TurbineService"></a>
<h2>@TurbineService</h2>
The annotation can only be used with a field.
A declared field in a class annotated with <code>@TurbineService</code>
gets injected an instance of this service at the time the instance
of the class is created. The field should have the type of the service
interface like in the following two examples:
<pre class="prettyprint"><code>
// Explicit service name
@TurbineService( &quot;RunDataService&quot; )
private RunDataService runDataService;
// Implicit SERVICE_NAME or ROLE
@TurbineService
private FactoryService factory;
</code></pre>
This is the equivalent of
<pre class="prettyprint"><code>
runDataService = (RunDataService) TurbineServices
.getInstance().getService(&quot;RunDataService&quot;);
factory = (FactoryService) TurbineServices
.getInstance().getService(FactoryService.ROLE);
</code></pre>
As you an see, the annotation supports an optional parameter, the
name of the service in the Turbine service repository. If this
parameter is not present, the annotation processor will look
for the field <code>SERVICE_NAME</code> and then <code>ROLE</code>
in the type class of the field to retrieve the service name. If none
of them can be found, the fully qualified class name of the
service interface is used to look up the service.
<br />
If the service instance cannot be found, the annotation processor
will throw an exception.
</section>
<section><a id="a.40TurbineConfiguration"></a>
<h2>@TurbineConfiguration</h2>
The annotation can only be used with a field.
If a declared field of the type <code>Configuration</code> is annotated
with <code>@TurbineConfiguration</code>, Turbine will inject an instance
of the Turbine configuration object at the time the instance of the class
is created.
<pre class="prettyprint"><code>
// Injected configuration instance
@TurbineConfiguration
private Configuration config;
// Injected configuration subset instance
@TurbineConfiguration( &quot;action&quot; )
private Configuration actionConfig;
</code></pre>
This is the equivalent of
<pre class="prettyprint"><code>
config = Turbine.getConfiguration();
actionConfig = Turbine.getConfiguration().subset(&quot;action&quot;);
</code></pre>
The annotation supports an optional parameter, the
prefix of the configuration subset to retrieve.
<br />
If other fields having simple types are annotated with
<code>@TurbineConfiguration</code>, Turbine will inject the corresponding
configuration value. In this case, the annotation parameter defines the
configuration key and is required. Strings, Lists and most simple types
are supported. The value will only be set if the key is found in the
configuration, so that the field can be initialized with a default value.
<pre class="prettyprint"><code>
// Injected configuration value
@TurbineConfiguration( &quot;module.cache&quot; )
private boolean moduleCache = true;
@TurbineConfiguration( &quot;template.homepage&quot; )
private String templateHomepage;
</code></pre>
This is the equivalent of
<pre class="prettyprint"><code>
moduleCache = Turbine.getConfiguration().getBoolean(&quot;module.cache&quot;, true);
templateHomepage = Turbine.getConfiguration().getString(&quot;template.homepage&quot;);
</code></pre>
</section>
<section><a id="a.40TurbineLoader"></a>
<h2>@TurbineLoader</h2>
The annotation can only be used with a field.
A declared field in a class annotated with <code>@TurbineLoader</code>
gets injected an instance of the specified <code>Loader</code> at
the time the instance of the class is created. The field should have
the type of the loader.
<pre class="prettyprint"><code>
// Injected loader instance
@TurbineLoader( Action.class )
private ActionLoader actionLoader;
</code></pre>
This is the equivalent of
<pre class="prettyprint"><code>
actionLoader = TurbineAssemblerBroker.getLoader(Action.class);
</code></pre>
The annotation parameter is required and defines the type of module
that is to be loaded.
</section>
<section><a id="a.40TurbineActionEvent"></a>
<h2>@TurbineActionEvent</h2>
The annotation can only be used with a method.
A method in a class annotated with <code>@TurbineActionEvent</code>
is associated to a named action event. The annotation parameter
is required and defines the name of the event. See the
<a href="action-event-howto.html">Action Events Howto</a>
for usage and examples.
</section>
<section><a id="a.40TurbineTool"></a>
<h2>@TurbineTool</h2>
The annotation can only be used with a field.
A declared field in a class annotated with <code>@TurbineTool</code>
gets injected an instance of the specified <code>ApplicationTool</code> at
the time the instance of the class is created. The field should have
the type of the tool.
<pre class="prettyprint"><code>
// Injected loader instance
@TurbineTool( TemplateLink.class )
private TemplateLink templateLink;
</code></pre>
Normally a tool needs an context (request, global, user). You have to set the context by calling the
tool.init(Object object) method. E.g. in action methods you have access to request and session context objects.
The annotation parameter is required and defines the type of the tool.
</section>
<section><a id="Performance_Considerations"></a>
<h2>Performance Considerations</h2>
It is important to note that the processing of the annotations at
the time the module class is instantiated takes some time. It is
therefore strongly recommended to re-use the module instances in
a production environment by setting the configuration parameter
<code>module.cache</code> to <code>true</code> in
<code>TurbineResources.properties</code>.
</section>
</section>
</main>
</div>
</div>
<hr/>
<footer>
<div class="container-fluid">
<div class="row-fluid">
<p>© 2000–2025
<a href="https://www.apache.org/">The Apache Software Foundation</a>
</p>
</div>
</div>
</footer>
</body>
</html>