| <!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( "RunDataService" ) |
| 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("RunDataService"); |
| |
| 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( "action" ) |
| private Configuration actionConfig; |
| </code></pre> |
| This is the equivalent of |
| |
| <pre class="prettyprint"><code> |
| config = Turbine.getConfiguration(); |
| |
| actionConfig = Turbine.getConfiguration().subset("action"); |
| </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( "module.cache" ) |
| private boolean moduleCache = true; |
| |
| @TurbineConfiguration( "template.homepage" ) |
| private String templateHomepage; |
| </code></pre> |
| This is the equivalent of |
| |
| <pre class="prettyprint"><code> |
| moduleCache = Turbine.getConfiguration().getBoolean("module.cache", true); |
| templateHomepage = Turbine.getConfiguration().getString("template.homepage"); |
| </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> |