blob: f7da1678a855073174fba696aec2a3cebcf126d5 [file]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(["setDoNotTrack", true]);
_paq.push(["disableCookies"]);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="https://analytics.apache.org/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '79']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
<title>19 Grails and Spring 5.3.0</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<link rel="stylesheet" href="../css/main.css" type="text/css" media="screen, print" title="Style" charset="utf-8"/>
<link rel="stylesheet" href="../css/pdf.css" type="text/css" media="print" title="PDF" charset="utf-8"/>
<script type="text/javascript">
function addJsClass() {
var classes = document.body.className.split(" ");
classes.push("js");
document.body.className = classes.join(" ");
}
</script>
</head>
<body class="body" onload="addJsClass();">
<div id="navigation">
<div class="navTitle">
The Grails Framework
</div>
<div class="navLinks">
<ul>
<li>
<div id="nav-summary" onmouseover="toggleNavSummary(false)" onmouseout="toggleNavSummary(true)">
<a href="../guide/index.html" class="button">Table of contents</a>
<div id="nav-summary-childs" style="display:none;">
<div class="toc-item" style="margin-left:0"><a href="../guide/introduction.html"><strong>1</strong><span>Introduction</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/gettingStarted.html"><strong>2</strong><span>Getting Started</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/upgrading.html"><strong>3</strong><span>Upgrading from the previous versions</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/conf.html"><strong>4</strong><span>Configuration</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/commandLine.html"><strong>5</strong><span>The Command Line</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/profiles.html"><strong>6</strong><span>Application Profiles</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/GORM.html"><strong>7</strong><span>Object Relational Mapping (GORM)</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/theWebLayer.html"><strong>8</strong><span>The Web Layer</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/traits.html"><strong>9</strong><span>Traits</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/REST.html"><strong>10</strong><span>REST</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/async.html"><strong>11</strong><span>Asynchronous Programming</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/validation.html"><strong>12</strong><span>Validation</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/services.html"><strong>13</strong><span>The Service Layer</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/staticTypeCheckingAndCompilation.html"><strong>14</strong><span>Static Type Checking And Compilation</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/testing.html"><strong>15</strong><span>Testing</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/i18n.html"><strong>16</strong><span>Internationalization</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/security.html"><strong>17</strong><span>Security</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/plugins.html"><strong>18</strong><span>Plugins</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/spring.html"><strong>19</strong><span>Grails and Spring</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/scaffolding.html"><strong>20</strong><span>Scaffolding</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/deployment.html"><strong>21</strong><span>Deployment</span></a>
</div>
<div class="toc-item" style="margin-left:0"><a href="../guide/contributing.html"><strong>22</strong><span>Contributing to Grails</span></a>
</div>
</div>
</div>
</li>
<li class="separator selected">
<a id="ref-button" onclick="localToggle(); return false;" href="#">Quick Reference</a>
</li>
</ul>
</div>
</div>
<table id="colset" border="0" cellpadding="0" cellspacing="0">
<tr>
<td id="col1">
<div id="main" class="corner-all">
<div class="toc-item prev-left"><a href="../guide/plugins.html">&lt;&lt; <strong>18</strong><span>Plugins</span></a></div>
<span id='toggle-col1' class="toggle">(<a href="#" onclick="localToggle(); return false;">Quick Reference</a>)</span>
<div class="toc-item next-right"><a href="../guide/scaffolding.html"><strong>20</strong><span>Scaffolding</span> >></a></div>
<div class="project">
<h1>19 Grails and Spring</h1>
<p><strong>Version:</strong> 5.3.0</p>
</div>
<div id="table-of-content">
<h2>Table of Contents</h2>
<div class="toc-item" style="margin-left:0px"><a href="#springdslAdditional"><strong>19.1</strong><span>Configuring Additional Beans</span></a>
</div>
<div class="toc-item" style="margin-left:0px"><a href="#springdsl"><strong>19.2</strong><span>Runtime Spring with the Beans DSL</span></a>
</div>
<div class="toc-item" style="margin-left:0px"><a href="#theBeanBuilderDSLExplained"><strong>19.3</strong><span>The BeanBuilder DSL Explained</span></a>
</div>
<div class="toc-item" style="margin-left:0px"><a href="#propertyPlaceholderConfiguration"><strong>19.4</strong><span>Property Placeholder Configuration</span></a>
</div>
<div class="toc-item" style="margin-left:0px"><a href="#propertyOverrideConfiguration"><strong>19.5</strong><span>Property Override Configuration</span></a>
</div>
<div class="toc-item" style="margin-left:0px"><a href="#actuators"><strong>19.6</strong><span>Spring Boot Actuators</span></a>
</div>
</div>
<a name="16. Grails and Spring"><!-- Legacy link --></a>
<h1 id="spring">19 Grails and Spring</h1>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/grails/grails-doc/edit/5.3.x/src/en/guide/spring.adoc"'>
<i class='fa fa-pencil-square-o'></i> Improve this doc
</button>
</div>
<div class="paragraph">
<p>This section is for advanced users and those who are interested in how Grails integrates with and builds on the <a href="http://spring.io/">Spring Framework</a>. It is also useful for <a href="plugins.html">plugin developers</a> considering doing runtime configuration Grails.</p>
</div>
<a name="16.2 Configuring Additional Beans"><!-- Legacy link --></a>
<h2 id="springdslAdditional">19.1 Configuring Additional Beans</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/grails/grails-doc/edit/5.3.x/src/en/guide/spring/springdslAdditional.adoc"'>
<i class='fa fa-pencil-square-o'></i> Improve this doc
</button>
</div>
<div class="sect3">
<h4 id="_using_the_spring_bean_dsl">Using the Spring Bean DSL</h4>
<div class="paragraph">
<p>You can easily register new (or override existing) beans by configuring them in <code>grails-app/conf/spring/resources.groovy</code> which uses the Grails <a href="#springdsl">Spring DSL</a>. Beans are defined inside a <code>beans</code> property (a Closure):</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">beans = {
<span class="comment">// beans here</span>
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>As a simple example you can configure a bean with the following syntax:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">import</span> <span class="include">my.company.MyBeanImpl</span>
beans = {
myBean(MyBeanImpl) {
someProperty = <span class="integer">42</span>
otherProperty = <span class="string"><span class="delimiter">&quot;</span><span class="content">blue</span><span class="delimiter">&quot;</span></span>
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Once configured, the bean can be auto-wired into Grails artifacts and other classes that support dependency injection (for example <code>BootStrap.groovy</code> and integration tests) by declaring a public field whose name is your bean&#8217;s name (in this case <code>myBean</code>):</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy"><span class="type">class</span> <span class="class">ExampleController</span> {
<span class="keyword">def</span> myBean
...
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Using the DSL has the advantage that you can mix bean declarations and logic, for example based on the <a href="conf.html#environments">environment</a>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">import</span> <span class="include">grails.util.Environment</span>
<span class="keyword">import</span> <span class="include">my.company.mock.MockImpl</span>
<span class="keyword">import</span> <span class="include">my.company.MyBeanImpl</span>
beans = {
<span class="keyword">switch</span>(Environment.current) {
<span class="keyword">case</span> Environment.PRODUCTION:
myBean(MyBeanImpl) {
someProperty = <span class="integer">42</span>
otherProperty = <span class="string"><span class="delimiter">&quot;</span><span class="content">blue</span><span class="delimiter">&quot;</span></span>
}
<span class="keyword">break</span>
<span class="keyword">case</span> Environment.DEVELOPMENT:
myBean(MockImpl) {
someProperty = <span class="integer">42</span>
otherProperty = <span class="string"><span class="delimiter">&quot;</span><span class="content">blue</span><span class="delimiter">&quot;</span></span>
}
<span class="keyword">break</span>
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>The <code>GrailsApplication</code> object can be accessed with the <code>application</code> variable and can be used to access the Grails configuration (amongst other things):</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">import</span> <span class="include">grails.util.Environment</span>
<span class="keyword">import</span> <span class="include">my.company.mock.MockImpl</span>
<span class="keyword">import</span> <span class="include">my.company.MyBeanImpl</span>
beans = {
<span class="keyword">if</span> (application.config.my.company.mockService) {
myBean(MockImpl) {
someProperty = <span class="integer">42</span>
otherProperty = <span class="string"><span class="delimiter">&quot;</span><span class="content">blue</span><span class="delimiter">&quot;</span></span>
}
} <span class="keyword">else</span> {
myBean(MyBeanImpl) {
someProperty = <span class="integer">42</span>
otherProperty = <span class="string"><span class="delimiter">&quot;</span><span class="content">blue</span><span class="delimiter">&quot;</span></span>
}
}
}</code></pre>
</div>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
If you define a bean in <code>resources.groovy</code> with the same name as one previously registered by Grails or an installed plugin, your bean will replace the previous registration. This is a convenient way to customize behavior without resorting to editing plugin code or other approaches that would affect maintainability.
</td>
</tr>
</table>
</div>
</div>
<div class="sect3">
<h4 id="_using_xml">Using XML</h4>
<div class="paragraph">
<p>Beans can also be configured using a <code>grails-app/conf/spring/resources.xml</code>. In earlier versions of Grails this file was automatically generated for you by the <code>run-app</code> script, but the DSL in <code>resources.groovy</code> is the preferred approach now so it isn&#8217;t automatically generated now. But it is still supported - you just need to create it yourself.</p>
</div>
<div class="paragraph">
<p>This file is typical Spring XML file and the Spring documentation has an <a href="http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/beans.html#beans-basics">excellent reference</a> on how to configure Spring beans.</p>
</div>
<div class="paragraph">
<p>The <code>myBean</code> bean that we configured using the DSL would be configured with this syntax in the XML file:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;bean</span> <span class="attribute-name">id</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">myBean</span><span class="delimiter">&quot;</span></span> <span class="attribute-name">class</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">my.company.MyBeanImpl</span><span class="delimiter">&quot;</span></span><span class="tag">&gt;</span>
<span class="tag">&lt;property</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">someProperty</span><span class="delimiter">&quot;</span></span> <span class="attribute-name">value</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">42</span><span class="delimiter">&quot;</span></span> <span class="tag">/&gt;</span>
<span class="tag">&lt;property</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">otherProperty</span><span class="delimiter">&quot;</span></span> <span class="attribute-name">value</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">blue</span><span class="delimiter">&quot;</span></span> <span class="tag">/&gt;</span>
<span class="tag">&lt;/bean&gt;</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>Like the other bean it can be auto-wired into any class that supports dependency injection:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy"><span class="type">class</span> <span class="class">ExampleController</span> {
<span class="keyword">def</span> myBean
}</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_referencing_existing_beans">Referencing Existing Beans</h4>
<div class="paragraph">
<p>Beans declared in <code>resources.groovy</code> or <code>resources.xml</code> can reference other beans by convention. For example if you had a <code>BookService</code> class its Spring bean name would be <code>bookService</code>, so your bean would reference it like this in the DSL:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">beans = {
myBean(MyBeanImpl) {
someProperty = <span class="integer">42</span>
otherProperty = <span class="string"><span class="delimiter">&quot;</span><span class="content">blue</span><span class="delimiter">&quot;</span></span>
bookService = ref(<span class="string"><span class="delimiter">&quot;</span><span class="content">bookService</span><span class="delimiter">&quot;</span></span>)
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>or like this in XML:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;bean</span> <span class="attribute-name">id</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">myBean</span><span class="delimiter">&quot;</span></span> <span class="attribute-name">class</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">my.company.MyBeanImpl</span><span class="delimiter">&quot;</span></span><span class="tag">&gt;</span>
<span class="tag">&lt;property</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">someProperty</span><span class="delimiter">&quot;</span></span> <span class="attribute-name">value</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">42</span><span class="delimiter">&quot;</span></span> <span class="tag">/&gt;</span>
<span class="tag">&lt;property</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">otherProperty</span><span class="delimiter">&quot;</span></span> <span class="attribute-name">value</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">blue</span><span class="delimiter">&quot;</span></span> <span class="tag">/&gt;</span>
<span class="tag">&lt;property</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">bookService</span><span class="delimiter">&quot;</span></span> <span class="attribute-name">ref</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">bookService</span><span class="delimiter">&quot;</span></span> <span class="tag">/&gt;</span>
<span class="tag">&lt;/bean&gt;</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>The bean needs a public setter for the bean reference (and also the two simple properties), which in Groovy would be defined like this:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">package</span> my.company
<span class="type">class</span> <span class="class">MyBeanImpl</span> {
<span class="predefined-type">Integer</span> someProperty
<span class="predefined-type">String</span> otherProperty
BookService bookService <span class="comment">// or just &quot;def bookService&quot;</span>
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>or in Java like this:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">package</span> my.company;
<span class="type">class</span> <span class="class">MyBeanImpl</span> {
<span class="directive">private</span> BookService bookService;
<span class="directive">private</span> <span class="predefined-type">Integer</span> someProperty;
<span class="directive">private</span> <span class="predefined-type">String</span> otherProperty;
<span class="directive">public</span> <span class="type">void</span> setBookService(BookService theBookService) {
<span class="local-variable">this</span>.bookService = theBookService;
}
<span class="directive">public</span> <span class="type">void</span> setSomeProperty(<span class="predefined-type">Integer</span> someProperty) {
<span class="local-variable">this</span>.someProperty = someProperty;
}
<span class="directive">public</span> <span class="type">void</span> setOtherProperty(<span class="predefined-type">String</span> otherProperty) {
<span class="local-variable">this</span>.otherProperty = otherProperty;
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Using <code>ref</code> (in XML or the DSL) is very powerful since it configures a runtime reference, so the referenced bean doesn&#8217;t have to exist yet. As long as it&#8217;s in place when the final application context configuration occurs, everything will be resolved correctly.</p>
</div>
<div class="paragraph">
<p>For a full reference of the available beans see the plugin reference in the reference guide.</p>
</div>
</div>
<a name="16.3 Runtime Spring with the Beans DSL"><!-- Legacy link --></a>
<h2 id="springdsl">19.2 Runtime Spring with the Beans DSL</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/grails/grails-doc/edit/5.3.x/src/en/guide/spring/springdsl.adoc"'>
<i class='fa fa-pencil-square-o'></i> Improve this doc
</button>
</div>
<div class="paragraph">
<p>This Bean builder in Grails aims to provide a simplified way of wiring together dependencies that uses Spring at its core.</p>
</div>
<div class="paragraph">
<p>In addition, Spring&#8217;s regular way of configuration (via XML and annotations) is static and difficult to modify and configure at runtime, other than programmatic XML creation which is both error prone and verbose. Grails' <a href="https://grails.apache.org/docs/5.3.0/api/grails/spring/BeanBuilder.html">BeanBuilder</a> changes all that by making it possible to programmatically wire together components at runtime, allowing you to adapt the logic based on system properties or environment variables.</p>
</div>
<div class="paragraph">
<p>This enables the code to adapt to its environment and avoids unnecessary duplication of code (having different Spring configs for test, development and production environments)</p>
</div>
<div class="sect3">
<h4 id="_the_beanbuilder_class">The BeanBuilder class</h4>
<div class="paragraph">
<p>Grails provides a <a href="https://grails.apache.org/docs/5.3.0/api/grails/spring/BeanBuilder.html">grails.spring.BeanBuilder</a> class that uses dynamic Groovy to construct bean definitions. The basics are as follows:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">import</span> <span class="include">org.apache.commons.dbcp.BasicDataSource</span>
<span class="keyword">import</span> <span class="include">org.grails.orm.hibernate.ConfigurableLocalSessionFactoryBean</span>
<span class="keyword">import</span> <span class="include">org.springframework.context.ApplicationContext</span>
<span class="keyword">import</span> <span class="include">grails.spring.BeanBuilder</span>
<span class="keyword">def</span> bb = <span class="keyword">new</span> BeanBuilder()
bb.beans {
dataSource(BasicDataSource) {
driverClassName = <span class="string"><span class="delimiter">&quot;</span><span class="content">org.h2.Driver</span><span class="delimiter">&quot;</span></span>
url = <span class="string"><span class="delimiter">&quot;</span><span class="content">jdbc:h2:mem:grailsDB</span><span class="delimiter">&quot;</span></span>
username = <span class="string"><span class="delimiter">&quot;</span><span class="content">sa</span><span class="delimiter">&quot;</span></span>
password = <span class="string"><span class="delimiter">&quot;</span><span class="delimiter">&quot;</span></span>
}
sessionFactory(ConfigurableLocalSessionFactoryBean) {
dataSource = ref(<span class="string"><span class="delimiter">'</span><span class="content">dataSource</span><span class="delimiter">'</span></span>)
hibernateProperties = [<span class="string"><span class="delimiter">&quot;</span><span class="content">hibernate.hbm2ddl.auto</span><span class="delimiter">&quot;</span></span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">create-drop</span><span class="delimiter">&quot;</span></span>,
<span class="string"><span class="delimiter">&quot;</span><span class="content">hibernate.show_sql</span><span class="delimiter">&quot;</span></span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">true</span><span class="delimiter">&quot;</span></span>]
}
}
ApplicationContext appContext = bb.createApplicationContext()</code></pre>
</div>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
Within <a href="plugins.html">plugins</a> and the <code>grails-app/conf/spring/resources.groovy</code> file you don&#8217;t need to create a new instance of <code>BeanBuilder</code>. Instead the DSL is implicitly available inside the <code>doWithSpring</code> and <code>beans</code> blocks respectively.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>This example shows how you would configure Hibernate with a data source with the <code>BeanBuilder</code> class.</p>
</div>
<div class="paragraph">
<p>Each method call (in this case <code>dataSource</code> and <code>sessionFactory</code> calls) maps to the name of the bean in Spring. The first argument to the method is the bean&#8217;s class, whilst the last argument is a block. Within the body of the block you can set properties on the bean using standard Groovy syntax.</p>
</div>
<div class="paragraph">
<p>Bean references are resolved automatically using the name of the bean. This can be seen in the example above with the way the <code>sessionFactory</code> bean resolves the <code>dataSource</code> reference.</p>
</div>
<div class="paragraph">
<p>Certain special properties related to bean management can also be set by the builder, as seen in the following code:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">sessionFactory(ConfigurableLocalSessionFactoryBean) { bean -&gt;
<span class="comment">// Autowiring behaviour. The other option is 'byType'. &lt;&lt;autowire&gt;&gt;</span>
bean.autowire = <span class="string"><span class="delimiter">'</span><span class="content">byName</span><span class="delimiter">'</span></span>
<span class="comment">// Sets the initialisation method to 'init'. [init-method]</span>
bean.initMethod = <span class="string"><span class="delimiter">'</span><span class="content">init</span><span class="delimiter">'</span></span>
<span class="comment">// Sets the destruction method to 'destroy'. [destroy-method]</span>
bean.destroyMethod = <span class="string"><span class="delimiter">'</span><span class="content">destroy</span><span class="delimiter">'</span></span>
<span class="comment">// Sets the scope of the bean. &lt;&lt;scope&gt;&gt;</span>
bean.scope = <span class="string"><span class="delimiter">'</span><span class="content">request</span><span class="delimiter">'</span></span>
dataSource = ref(<span class="string"><span class="delimiter">'</span><span class="content">dataSource</span><span class="delimiter">'</span></span>)
hibernateProperties = [<span class="string"><span class="delimiter">&quot;</span><span class="content">hibernate.hbm2ddl.auto</span><span class="delimiter">&quot;</span></span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">create-drop</span><span class="delimiter">&quot;</span></span>,
<span class="string"><span class="delimiter">&quot;</span><span class="content">hibernate.show_sql</span><span class="delimiter">&quot;</span></span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">true</span><span class="delimiter">&quot;</span></span>]
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>The strings in square brackets are the names of the equivalent bean attributes in Spring&#8217;s XML definition.</p>
</div>
</div>
<div class="sect3">
<h4 id="_using_beanbuilder_with_spring_mvc">Using BeanBuilder with Spring MVC</h4>
<div class="paragraph">
<p>Include the <code>grails-spring-&lt;version&gt;.jar</code> file in your classpath to use BeanBuilder in a regular Spring MVC application. Then add the following <code>&lt;context-param&gt;</code> values to your <code>/WEB-INF/web.xml</code> file:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;context-param&gt;</span>
<span class="tag">&lt;param-name&gt;</span>contextConfigLocation<span class="tag">&lt;/param-name&gt;</span>
<span class="tag">&lt;param-value&gt;</span>/WEB-INF/applicationContext.groovy<span class="tag">&lt;/param-value&gt;</span>
<span class="tag">&lt;/context-param&gt;</span>
<span class="tag">&lt;context-param&gt;</span>
<span class="tag">&lt;param-name&gt;</span>contextClass<span class="tag">&lt;/param-name&gt;</span>
<span class="tag">&lt;param-value&gt;</span>
grails.web.servlet.context.GrailsWebApplicationContext
<span class="tag">&lt;/param-value&gt;</span>
<span class="tag">&lt;/context-param&gt;</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>Then create a <code>/WEB-INF/applicationContext.groovy</code> file that does the rest:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">import</span> <span class="include">org.apache.commons.dbcp.BasicDataSource</span>
beans {
dataSource(BasicDataSource) {
driverClassName = <span class="string"><span class="delimiter">&quot;</span><span class="content">org.h2.Driver</span><span class="delimiter">&quot;</span></span>
url = <span class="string"><span class="delimiter">&quot;</span><span class="content">jdbc:h2:mem:grailsDB</span><span class="delimiter">&quot;</span></span>
username = <span class="string"><span class="delimiter">&quot;</span><span class="content">sa</span><span class="delimiter">&quot;</span></span>
password = <span class="string"><span class="delimiter">&quot;</span><span class="delimiter">&quot;</span></span>
}
}</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_loading_bean_definitions_from_the_file_system">Loading Bean Definitions from the File System</h4>
<div class="paragraph">
<p>You can use the <code>BeanBuilder</code> class to load external Groovy scripts that define beans using the same path matching syntax defined here. For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> bb = <span class="keyword">new</span> BeanBuilder()
bb.loadBeans(<span class="string"><span class="delimiter">&quot;</span><span class="content">classpath:*SpringBeans.groovy</span><span class="delimiter">&quot;</span></span>)
<span class="keyword">def</span> applicationContext = bb.createApplicationContext()</code></pre>
</div>
</div>
<div class="paragraph">
<p>Here the <code>BeanBuilder</code> loads all Groovy files on the classpath ending with <code>SpringBeans.groovy</code> and parses them into bean definitions. An example script can be seen below:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">import</span> <span class="include">org.apache.commons.dbcp.BasicDataSource</span>
<span class="keyword">import</span> <span class="include">org.grails.orm.hibernate.ConfigurableLocalSessionFactoryBean</span>
beans {
dataSource(BasicDataSource) {
driverClassName = <span class="string"><span class="delimiter">&quot;</span><span class="content">org.h2.Driver</span><span class="delimiter">&quot;</span></span>
url = <span class="string"><span class="delimiter">&quot;</span><span class="content">jdbc:h2:mem:grailsDB</span><span class="delimiter">&quot;</span></span>
username = <span class="string"><span class="delimiter">&quot;</span><span class="content">sa</span><span class="delimiter">&quot;</span></span>
password = <span class="string"><span class="delimiter">&quot;</span><span class="delimiter">&quot;</span></span>
}
sessionFactory(ConfigurableLocalSessionFactoryBean) {
dataSource = dataSource
hibernateProperties = [<span class="string"><span class="delimiter">&quot;</span><span class="content">hibernate.hbm2ddl.auto</span><span class="delimiter">&quot;</span></span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">create-drop</span><span class="delimiter">&quot;</span></span>,
<span class="string"><span class="delimiter">&quot;</span><span class="content">hibernate.show_sql</span><span class="delimiter">&quot;</span></span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">true</span><span class="delimiter">&quot;</span></span>]
}
}</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_adding_variables_to_the_binding_context">Adding Variables to the Binding (Context)</h4>
<div class="paragraph">
<p>If you&#8217;re loading beans from a script you can set the binding to use by creating a Groovy <code>Binding</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> binding = <span class="keyword">new</span> <span class="predefined-type">Binding</span>()
binding.maxSize = <span class="integer">10000</span>
binding.productGroup = <span class="string"><span class="delimiter">'</span><span class="content">finance</span><span class="delimiter">'</span></span>
<span class="keyword">def</span> bb = <span class="keyword">new</span> BeanBuilder()
bb.binding = binding
bb.loadBeans(<span class="string"><span class="delimiter">&quot;</span><span class="content">classpath:*SpringBeans.groovy</span><span class="delimiter">&quot;</span></span>)
<span class="keyword">def</span> ctx = bb.createApplicationContext()</code></pre>
</div>
</div>
<div class="paragraph">
<p>Then you can access the <code>maxSize</code> and <code>productGroup</code> properties in your DSL files.</p>
</div>
</div>
<a name="16.4 The BeanBuilder DSL Explained"><!-- Legacy link --></a>
<h2 id="theBeanBuilderDSLExplained">19.3 The BeanBuilder DSL Explained</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/grails/grails-doc/edit/5.3.x/src/en/guide/spring/theBeanBuilderDSLExplained.adoc"'>
<i class='fa fa-pencil-square-o'></i> Improve this doc
</button>
</div>
<div class="sect3">
<h4 id="_using_constructor_arguments">Using Constructor Arguments</h4>
<div class="paragraph">
<p>Constructor arguments can be defined using parameters to each bean-defining method. Put them after the first argument (the Class):</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">bb.beans {
exampleBean(MyExampleBean, <span class="string"><span class="delimiter">&quot;</span><span class="content">firstArgument</span><span class="delimiter">&quot;</span></span>, <span class="integer">2</span>) {
someProperty = [<span class="integer">1</span>, <span class="integer">2</span>, <span class="integer">3</span>]
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>This configuration corresponds to a <code>MyExampleBean</code> with a constructor that looks like this:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">MyExampleBean(<span class="predefined-type">String</span> foo, <span class="type">int</span> bar) {
...
}</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_configuring_the_beandefinition_using_factory_methods">Configuring the BeanDefinition (Using factory methods)</h4>
<div class="paragraph">
<p>The first argument to the closure is a reference to the bean configuration instance, which you can use to configure factory methods and invoke any method on the <a href="https://docs.spring.io/spring/docs/5.3.8/javadoc-api/org/springframework/beans/factory/support/AbstractBeanDefinition.html">AbstractBeanDefinition</a> class:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">bb.beans {
exampleBean(MyExampleBean) { bean -&gt;
bean.factoryMethod = <span class="string"><span class="delimiter">&quot;</span><span class="content">getInstance</span><span class="delimiter">&quot;</span></span>
bean.singleton = <span class="predefined-constant">false</span>
someProperty = [<span class="integer">1</span>, <span class="integer">2</span>, <span class="integer">3</span>]
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>As an alternative you can also use the return value of the bean defining method to configure the bean:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">bb.beans {
<span class="keyword">def</span> example = exampleBean(MyExampleBean) {
someProperty = [<span class="integer">1</span>, <span class="integer">2</span>, <span class="integer">3</span>]
}
example.factoryMethod = <span class="string"><span class="delimiter">&quot;</span><span class="content">getInstance</span><span class="delimiter">&quot;</span></span>
}</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_using_factory_beans">Using Factory beans</h4>
<div class="paragraph">
<p>Spring defines the concept of factory beans and often a bean is created not directly from a new instance of a Class, but from one of these factories. In this case the bean has no Class argument and instead you must pass the name of the factory bean to the bean defining method:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">bb.beans {
myFactory(ExampleFactoryBean) {
someProperty = [<span class="integer">1</span>, <span class="integer">2</span>, <span class="integer">3</span>]
}
myBean(myFactory) {
name = <span class="string"><span class="delimiter">&quot;</span><span class="content">blah</span><span class="delimiter">&quot;</span></span>
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Another common approach is provide the name of the factory method to call on the factory bean. This can be done using Groovy&#8217;s named parameter syntax:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">bb.beans {
myFactory(ExampleFactoryBean) {
someProperty = [<span class="integer">1</span>, <span class="integer">2</span>, <span class="integer">3</span>]
}
myBean(<span class="key">myFactory</span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">getInstance</span><span class="delimiter">&quot;</span></span>) {
name = <span class="string"><span class="delimiter">&quot;</span><span class="content">blah</span><span class="delimiter">&quot;</span></span>
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Here the <code>getInstance</code> method on the <code>ExampleFactoryBean</code> bean will be called to create the <code>myBean</code> bean.</p>
</div>
</div>
<div class="sect3">
<h4 id="_creating_bean_references_at_runtime">Creating Bean References at Runtime</h4>
<div class="paragraph">
<p>Sometimes you don&#8217;t know the name of the bean to be created until runtime. In this case you can use a string interpolation to invoke a bean defining method dynamically:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> beanName = <span class="string"><span class="delimiter">&quot;</span><span class="content">example</span><span class="delimiter">&quot;</span></span>
bb.beans {
<span class="string"><span class="delimiter">&quot;</span><span class="inline"><span class="inline-delimiter">${</span>beanName<span class="inline-delimiter">}</span></span><span class="content">Bean</span><span class="delimiter">&quot;</span></span>(MyExampleBean) {
someProperty = [<span class="integer">1</span>, <span class="integer">2</span>, <span class="integer">3</span>]
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>In this case the <code>beanName</code> variable defined earlier is used when invoking a bean defining method. The example has a hard-coded value but would work just as well with a name that is generated programmatically based on configuration, system properties, etc.</p>
</div>
<div class="paragraph">
<p>Furthermore, because sometimes bean names are not known until runtime you may need to reference them by name when wiring together other beans, in this case using the <code>ref</code> method:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">def</span> beanName = <span class="string"><span class="delimiter">&quot;</span><span class="content">example</span><span class="delimiter">&quot;</span></span>
bb.beans {
<span class="string"><span class="delimiter">&quot;</span><span class="inline"><span class="inline-delimiter">${</span>beanName<span class="inline-delimiter">}</span></span><span class="content">Bean</span><span class="delimiter">&quot;</span></span>(MyExampleBean) {
someProperty = [<span class="integer">1</span>, <span class="integer">2</span>, <span class="integer">3</span>]
}
anotherBean(AnotherBean) {
example = ref(<span class="string"><span class="delimiter">&quot;</span><span class="inline"><span class="inline-delimiter">${</span>beanName<span class="inline-delimiter">}</span></span><span class="content">Bean</span><span class="delimiter">&quot;</span></span>)
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Here the example property of <code>AnotherBean</code> is set using a runtime reference to the <code>exampleBean</code>. The <code>ref</code> method can also be used to refer to beans from a parent <code>ApplicationContext</code> that is provided in the constructor of the <code>BeanBuilder</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">ApplicationContext parent = ...<span class="comment">//</span>
<span class="keyword">def</span> bb = <span class="keyword">new</span> BeanBuilder(parent)
bb.beans {
anotherBean(AnotherBean) {
example = ref(<span class="string"><span class="delimiter">&quot;</span><span class="inline"><span class="inline-delimiter">${</span>beanName<span class="inline-delimiter">}</span></span><span class="content">Bean</span><span class="delimiter">&quot;</span></span>, <span class="predefined-constant">true</span>)
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Here the second parameter <code>true</code> specifies that the reference will look for the bean in the parent context.</p>
</div>
</div>
<div class="sect3">
<h4 id="_using_anonymous_inner_beans">Using Anonymous (Inner) Beans</h4>
<div class="paragraph">
<p>You can use anonymous inner beans by setting a property of the bean to a block that takes an argument that is the bean type:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">bb.beans {
marge(Person) {
name = <span class="string"><span class="delimiter">&quot;</span><span class="content">Marge</span><span class="delimiter">&quot;</span></span>
husband = { Person p -&gt;
name = <span class="string"><span class="delimiter">&quot;</span><span class="content">Homer</span><span class="delimiter">&quot;</span></span>
age = <span class="integer">45</span>
props = [<span class="key">overweight</span>: <span class="predefined-constant">true</span>, <span class="key">height</span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">1.8m</span><span class="delimiter">&quot;</span></span>]
}
children = [ref(<span class="string"><span class="delimiter">'</span><span class="content">bart</span><span class="delimiter">'</span></span>), ref(<span class="string"><span class="delimiter">'</span><span class="content">lisa</span><span class="delimiter">'</span></span>)]
}
bart(Person) {
name = <span class="string"><span class="delimiter">&quot;</span><span class="content">Bart</span><span class="delimiter">&quot;</span></span>
age = <span class="integer">11</span>
}
lisa(Person) {
name = <span class="string"><span class="delimiter">&quot;</span><span class="content">Lisa</span><span class="delimiter">&quot;</span></span>
age = <span class="integer">9</span>
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>In the above example we set the <code>marge</code> bean&#8217;s husband property to a block that creates an inner bean reference. Alternatively if you have a factory bean you can omit the type and just use the specified bean definition instead to setup the factory:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">bb.beans {
personFactory(PersonFactory)
marge(Person) {
name = <span class="string"><span class="delimiter">&quot;</span><span class="content">Marge</span><span class="delimiter">&quot;</span></span>
husband = { bean -&gt;
bean.factoryBean = <span class="string"><span class="delimiter">&quot;</span><span class="content">personFactory</span><span class="delimiter">&quot;</span></span>
bean.factoryMethod = <span class="string"><span class="delimiter">&quot;</span><span class="content">newInstance</span><span class="delimiter">&quot;</span></span>
name = <span class="string"><span class="delimiter">&quot;</span><span class="content">Homer</span><span class="delimiter">&quot;</span></span>
age = <span class="integer">45</span>
props = [<span class="key">overweight</span>: <span class="predefined-constant">true</span>, <span class="key">height</span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">1.8m</span><span class="delimiter">&quot;</span></span>]
}
children = [ref(<span class="string"><span class="delimiter">'</span><span class="content">bart</span><span class="delimiter">'</span></span>), ref(<span class="string"><span class="delimiter">'</span><span class="content">lisa</span><span class="delimiter">'</span></span>)]
}
}</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="_abstract_beans_and_parent_bean_definitions">Abstract Beans and Parent Bean Definitions</h4>
<div class="paragraph">
<p>To create an abstract bean definition define a bean without a <code>Class</code> parameter:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy"><span class="type">class</span> <span class="class">HolyGrailQuest</span> {
<span class="keyword">def</span> <span class="function">start</span>() { println <span class="string"><span class="delimiter">&quot;</span><span class="content">lets begin</span><span class="delimiter">&quot;</span></span> }
}</code></pre>
</div>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy"><span class="type">class</span> <span class="class">KnightOfTheRoundTable</span> {
<span class="predefined-type">String</span> name
<span class="predefined-type">String</span> leader
HolyGrailQuest quest
KnightOfTheRoundTable(<span class="predefined-type">String</span> name) {
<span class="local-variable">this</span>.name = name
}
<span class="keyword">def</span> <span class="function">embarkOnQuest</span>() {
quest.start()
}
}</code></pre>
</div>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">import</span> <span class="include">grails.spring.BeanBuilder</span>
<span class="keyword">def</span> bb = <span class="keyword">new</span> BeanBuilder()
bb.beans {
abstractBean {
leader = <span class="string"><span class="delimiter">&quot;</span><span class="content">Lancelot</span><span class="delimiter">&quot;</span></span>
}
...
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Here we define an abstract bean that has a <code>leader</code> property with the value of <code>"Lancelot"</code>. To use the abstract bean set it as the parent of the child bean:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">bb.beans {
...
quest(HolyGrailQuest)
knights(KnightOfTheRoundTable, <span class="string"><span class="delimiter">&quot;</span><span class="content">Camelot</span><span class="delimiter">&quot;</span></span>) { bean -&gt;
bean.parent = abstractBean
quest = ref(<span class="string"><span class="delimiter">'</span><span class="content">quest</span><span class="delimiter">'</span></span>)
}
}</code></pre>
</div>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
When using a parent bean you must set the parent property of the bean before setting any other properties on the bean!
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>If you want an abstract bean that has a <code>Class</code> specified you can do it this way:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy"><span class="keyword">import</span> <span class="include">grails.spring.BeanBuilder</span>
<span class="keyword">def</span> bb = <span class="keyword">new</span> BeanBuilder()
bb.beans {
abstractBean(KnightOfTheRoundTable) { bean -&gt;
bean.<span class="string"><span class="delimiter">'</span><span class="content">abstract</span><span class="delimiter">'</span></span> = <span class="predefined-constant">true</span>
leader = <span class="string"><span class="delimiter">&quot;</span><span class="content">Lancelot</span><span class="delimiter">&quot;</span></span>
}
quest(HolyGrailQuest)
knights(<span class="string"><span class="delimiter">&quot;</span><span class="content">Camelot</span><span class="delimiter">&quot;</span></span>) { bean -&gt;
bean.parent = abstractBean
quest = quest
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>In this example we create an abstract bean of type <code>KnightOfTheRoundTable</code> and use the bean argument to set it to abstract. Later we define a knights bean that has no <code>Class</code> defined, but inherits the <code>Class</code> from the parent bean.</p>
</div>
</div>
<div class="sect3">
<h4 id="_using_spring_namespaces">Using Spring Namespaces</h4>
<div class="paragraph">
<p>Since Spring 2.0, users of Spring have had easier access to key features via XML namespaces. You can use a Spring namespace in BeanBuilder by declaring it with this syntax:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">xmlns <span class="key">context</span>:<span class="string"><span class="delimiter">&quot;</span><span class="content">http://www.springframework.org/schema/context</span><span class="delimiter">&quot;</span></span></code></pre>
</div>
</div>
<div class="paragraph">
<p>and then invoking a method that matches the names of the Spring namespace tag and its associated attributes:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">context.<span class="string"><span class="delimiter">'</span><span class="content">component-scan</span><span class="delimiter">'</span></span>(<span class="string"><span class="delimiter">'</span><span class="content">base-package</span><span class="delimiter">'</span></span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">my.company.domain</span><span class="delimiter">&quot;</span></span>)</code></pre>
</div>
</div>
<div class="paragraph">
<p>You can do some useful things with Spring namespaces, such as looking up a JNDI resource:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">xmlns <span class="key">jee</span>:<span class="string"><span class="delimiter">&quot;</span><span class="content">http://www.springframework.org/schema/jee</span><span class="delimiter">&quot;</span></span>
jee.<span class="string"><span class="delimiter">'</span><span class="content">jndi-lookup</span><span class="delimiter">'</span></span>(<span class="key">id</span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">dataSource</span><span class="delimiter">&quot;</span></span>, <span class="string"><span class="delimiter">'</span><span class="content">jndi-name</span><span class="delimiter">'</span></span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">java:comp/env/myDataSource</span><span class="delimiter">&quot;</span></span>)</code></pre>
</div>
</div>
<div class="paragraph">
<p>This example will create a Spring bean with the identifier <code>dataSource</code> by performing a JNDI lookup on the given JNDI name. With Spring namespaces you also get full access to all of the powerful AOP support in Spring from BeanBuilder. For example given these two classes:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy"><span class="type">class</span> <span class="class">Person</span> {
<span class="type">int</span> age
<span class="predefined-type">String</span> name
<span class="type">void</span> birthday() {
++age;
}
}</code></pre>
</div>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy"><span class="type">class</span> <span class="class">BirthdayCardSender</span> {
<span class="predefined-type">List</span> peopleSentCards = <span class="type">[]</span>
<span class="type">void</span> onBirthday(Person person) {
peopleSentCards &lt;&lt; person
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>You can define an aspect that uses a pointcut to detect whenever the <code>birthday()</code> method is called:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">xmlns <span class="key">aop</span>:<span class="string"><span class="delimiter">&quot;</span><span class="content">http://www.springframework.org/schema/aop</span><span class="delimiter">&quot;</span></span>
fred(Person) {
name = <span class="string"><span class="delimiter">&quot;</span><span class="content">Fred</span><span class="delimiter">&quot;</span></span>
age = <span class="integer">45</span>
}
birthdayCardSenderAspect(BirthdayCardSender)
aop {
config(<span class="string"><span class="delimiter">&quot;</span><span class="content">proxy-target-class</span><span class="delimiter">&quot;</span></span>: <span class="predefined-constant">true</span>) {
aspect(<span class="key">id</span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">sendBirthdayCard</span><span class="delimiter">&quot;</span></span>, <span class="key">ref</span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">birthdayCardSenderAspect</span><span class="delimiter">&quot;</span></span>) {
after <span class="key">method</span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">onBirthday</span><span class="delimiter">&quot;</span></span>,
<span class="key">pointcut</span>: <span class="string"><span class="delimiter">&quot;</span><span class="content">execution(void ..Person.birthday()) and this(person)</span><span class="delimiter">&quot;</span></span>
}
}
}</code></pre>
</div>
</div>
</div>
<a name="16.5 Property Placeholder Configuration"><!-- Legacy link --></a>
<h2 id="propertyPlaceholderConfiguration">19.4 Property Placeholder Configuration</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/grails/grails-doc/edit/5.3.x/src/en/guide/spring/propertyPlaceholderConfiguration.adoc"'>
<i class='fa fa-pencil-square-o'></i> Improve this doc
</button>
</div>
<div class="paragraph">
<p>Grails supports the notion of property placeholder configuration through an extended version of Spring&#8217;s <a href="https://docs.spring.io/spring/docs/5.3.8/javadoc-api/org/springframework/beans/factory/config/PropertyPlaceholderConfigurer.html">PropertyPlaceholderConfigurer</a>.</p>
</div>
<div class="paragraph">
<p>Settings defined in either <a href="https://docs.groovy-lang.org/3.0.7/html/gapi/groovy/util/ConfigSlurper.html">ConfigSlurper</a> scripts or Java properties files can be used as placeholder values for Spring configuration in <code>grails-app/conf/spring/resources.xml</code> and <code>grails-app/conf/spring/resources.groovy</code>. For example given the following entries in <code>grails-app/conf/application.groovy</code> (or an externalized config):</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">database.driver=<span class="string"><span class="delimiter">&quot;</span><span class="content">com.mysql.jdbc.Driver</span><span class="delimiter">&quot;</span></span>
database.dbname=<span class="string"><span class="delimiter">&quot;</span><span class="content">mysql:mydb</span><span class="delimiter">&quot;</span></span></code></pre>
</div>
</div>
<div class="paragraph">
<p>You can then specify placeholders in <code>resources.xml</code> as follows using the familiar ${..} syntax:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="xml"><span class="tag">&lt;bean</span> <span class="attribute-name">id</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">dataSource</span><span class="delimiter">&quot;</span></span>
<span class="attribute-name">class</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">org.springframework.jdbc.datasource.DriverManagerDataSource</span><span class="delimiter">&quot;</span></span><span class="tag">&gt;</span>
<span class="tag">&lt;property</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">driverClassName</span><span class="delimiter">&quot;</span></span><span class="tag">&gt;</span>
<span class="tag">&lt;value&gt;</span>${database.driver}<span class="tag">&lt;/value&gt;</span>
<span class="tag">&lt;/property&gt;</span>
<span class="tag">&lt;property</span> <span class="attribute-name">name</span>=<span class="string"><span class="delimiter">&quot;</span><span class="content">url</span><span class="delimiter">&quot;</span></span><span class="tag">&gt;</span>
<span class="tag">&lt;value&gt;</span>jdbc:${database.dbname}<span class="tag">&lt;/value&gt;</span>
<span class="tag">&lt;/property&gt;</span>
<span class="tag">&lt;/bean&gt;</span></code></pre>
</div>
</div>
<div class="paragraph">
<p>To specify placeholders in <code>resources.groovy</code> you need to use single quotes:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">dataSource(org.springframework.jdbc.datasource.DriverManagerDataSource) {
driverClassName = <span class="string"><span class="delimiter">'</span><span class="content">${database.driver}</span><span class="delimiter">'</span></span>
url = <span class="string"><span class="delimiter">'</span><span class="content">jdbc:${database.dbname}</span><span class="delimiter">'</span></span>
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>This sets the property value to a literal string which is later resolved against the config by Spring&#8217;s PropertyPlaceholderConfigurer.</p>
</div>
<div class="paragraph">
<p>A better option for <code>resources.groovy</code> is to access properties through the <code>grailsApplication</code> variable:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">dataSource(org.springframework.jdbc.datasource.DriverManagerDataSource) {
driverClassName = grailsApplication.config.database.driver
url = <span class="string"><span class="delimiter">&quot;</span><span class="content">jdbc</span><span class="content">\:</span><span class="inline"><span class="inline-delimiter">${</span>grailsApplication.config.database.dbname<span class="inline-delimiter">}</span></span><span class="delimiter">&quot;</span></span>
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Using this approach will keep the types as defined in your config.</p>
</div>
<a name="16.6 Property Override Configuration"><!-- Legacy link --></a>
<h2 id="propertyOverrideConfiguration">19.5 Property Override Configuration</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/grails/grails-doc/edit/5.3.x/src/en/guide/spring/propertyOverrideConfiguration.adoc"'>
<i class='fa fa-pencil-square-o'></i> Improve this doc
</button>
</div>
<div class="paragraph">
<p>Grails supports setting of bean properties via <a href="conf.html">configuration</a>.</p>
</div>
<div class="paragraph">
<p>You define a <code>beans</code> block with the names of beans and their values:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">beans {
bookService {
webServiceURL = <span class="string"><span class="delimiter">&quot;</span><span class="content">http://www.amazon.com</span><span class="delimiter">&quot;</span></span>
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>The general format is:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">&lt;&lt;bean name&gt;&gt;.&lt;&lt;property name&gt;&gt; = &lt;&lt;value&gt;&gt;</code></pre>
</div>
</div>
<div class="paragraph">
<p>The same configuration in a Java properties file would be:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="groovy">beans.bookService.webServiceURL=<span class="key">http</span>:<span class="comment">//www.amazon.com</span></code></pre>
</div>
</div>
<h2 id="actuators">19.6 Spring Boot Actuators</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/grails/grails-doc/edit/5.3.x/src/en/guide/spring/actuators.adoc"'>
<i class='fa fa-pencil-square-o'></i> Improve this doc
</button>
</div>
<div class="paragraph">
<p><a href="https://docs.spring.io/spring-boot/docs/2.5.2/reference/html/production-ready-endpoints.html">Spring Boot Actuator endpoints</a> allow you to monitor and interact with your application. Spring Boot includes a number of built-in endpoints. For example the <code>health</code> endpoint provides basic application health information.</p>
</div>
<div class="paragraph">
<p>These endpoints are disabled by default since Grails 3.1.8.</p>
</div>
<div class="paragraph">
<p>You can enable actuator endpoints in your <code>application.yml</code> as follows:</p>
</div>
<div class="listingblock">
<div class="title">grails-app/conf/application.yml</div>
<div class="content">
<pre class="CodeRay highlight"><code data-lang="yml"><span class="key">management</span>:
<span class="key">endpoints</span>:
<span class="key">enabled-by-default</span>: <span class="string"><span class="content">true</span></span></code></pre>
</div>
</div>
<div style="clear:both;margin-top:15px;"></div>
<div class="toc-item prev-left"><a href="../guide/plugins.html">&lt;&lt; <strong>18</strong><span>Plugins</span></a></div>
<div class="toc-item next-right"><a href="../guide/scaffolding.html"><strong>20</strong><span>Scaffolding</span> >></a></div>
<div style="clear:both"></div>
</div>
</td>
<td id="col2">
<div class="local clearfix">
<div class="local-title">
<a href="../guide/index.html" target="mainFrame">Quick Reference</a>
<span class="toggle">(<a href="#" onclick="localToggle(); return false;">hide</a>)</span>
</div>
<div class="menu">
<div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Command Line</h1><div class="menu-sub">
<div class="menu-item"><a href="../ref/Command%20Line/Usage.html">Usage</a></div>
<div class="menu-item"><a href="../ref/Command%20Line/bug-report.html">bug-report</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/clean.html">clean</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/compile.html">compile</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/console.html">console</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-app.html">create-app</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-command.html">create-command</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-controller.html">create-controller</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-domain-class.html">create-domain-class</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-functional-test.html">create-functional-test</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-hibernate-cfg-xml.html">create-hibernate-cfg-xml</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-integration-test.html">create-integration-test</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-interceptor.html">create-interceptor</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-plugin.html">create-plugin</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-profile.html">create-profile</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-script.html">create-script</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-service.html">create-service</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-taglib.html">create-taglib</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/create-unit-test.html">create-unit-test</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/dependency-report.html">dependency-report</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/docs.html">docs</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/generate-all.html">generate-all</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/generate-controller.html">generate-controller</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/generate-views.html">generate-views</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/help.html">help</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/install-templates.html">install-templates</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/list-plugins.html">list-plugins</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/list-profiles.html">list-profiles</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/package-plugin.html">package-plugin</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/package.html">package</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/plugin-info.html">plugin-info</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/profile-info.html">profile-info</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/run-app.html">run-app</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/run-command.html">run-command</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/run-script.html">run-script</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/schema-export.html">schema-export</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/shell.html">shell</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/stats.html">stats</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/stop-app.html">stop-app</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/test-app.html">test-app</a>
</div>
<div class="menu-item"><a href="../ref/Command%20Line/war.html">war</a>
</div>
</div>
</div>
<div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Constraints</h1><div class="menu-sub">
<div class="menu-item"><a href="../ref/Constraints/Usage.html">Usage</a></div>
<div class="menu-item"><a href="../ref/Constraints/attributes.html">attributes</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/bindable.html">bindable</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/blank.html">blank</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/creditCard.html">creditCard</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/email.html">email</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/inList.html">inList</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/matches.html">matches</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/max.html">max</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/maxSize.html">maxSize</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/min.html">min</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/minSize.html">minSize</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/notEqual.html">notEqual</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/nullable.html">nullable</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/range.html">range</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/scale.html">scale</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/size.html">size</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/unique.html">unique</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/url.html">url</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/validator.html">validator</a>
</div>
<div class="menu-item"><a href="../ref/Constraints/widget.html">widget</a>
</div>
</div>
</div>
<div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Controllers</h1><div class="menu-sub">
<div class="menu-item"><a href="../ref/Controllers/Usage.html">Usage</a></div>
<div class="menu-item"><a href="../ref/Controllers/actionName.html">actionName</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/allowedMethods.html">allowedMethods</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/bindData.html">bindData</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/chain.html">chain</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/controllerName.html">controllerName</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/defaultAction.html">defaultAction</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/errors.html">errors</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/flash.html">flash</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/forward.html">forward</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/grailsApplication.html">grailsApplication</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/hasErrors.html">hasErrors</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/header.html">header</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/namespace.html">namespace</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/params.html">params</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/redirect.html">redirect</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/render.html">render</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/request.html">request</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/respond.html">respond</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/response.html">response</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/responseFormats.html">responseFormats</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/scope.html">scope</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/servletContext.html">servletContext</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/session.html">session</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/withForm.html">withForm</a>
</div>
<div class="menu-item"><a href="../ref/Controllers/withFormat.html">withFormat</a>
</div>
</div>
</div>
<div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Database Mapping</h1><div class="menu-sub">
<div class="menu-item"><a href="../ref/Database%20Mapping/Usage.html">Usage</a></div>
<div class="menu-item"><a href="../ref/Database%20Mapping/autoImport.html">autoImport</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/autoTimestamp.html">autoTimestamp</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/batchSize.html">batchSize</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/cache.html">cache</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/cascade.html">cascade</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/column.html">column</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/comment.html">comment</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/discriminator.html">discriminator</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/dynamicInsert.html">dynamicInsert</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/dynamicUpdate.html">dynamicUpdate</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/fetch.html">fetch</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/id.html">id</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/ignoreNotFound.html">ignoreNotFound</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/indexColumn.html">indexColumn</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/insertable.html">insertable</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/joinTable.html">joinTable</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/lazy.html">lazy</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/order.html">order</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/sort.html">sort</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/table.html">table</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/type.html">type</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/updateable.html">updateable</a>
</div>
<div class="menu-item"><a href="../ref/Database%20Mapping/version.html">version</a>
</div>
</div>
</div>
<div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Domain Classes</h1><div class="menu-sub">
<div class="menu-item"><a href="../ref/Domain%20Classes/Usage.html">Usage</a></div>
<div class="menu-item"><a href="../ref/Domain%20Classes/addTo.html">addTo</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/attach.html">attach</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/belongsTo.html">belongsTo</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/clearErrors.html">clearErrors</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/constraints.html">constraints</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/count.html">count</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/countBy.html">countBy</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/createCriteria.html">createCriteria</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/delete.html">delete</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/discard.html">discard</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/embedded.html">embedded</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/errors.html">errors</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/executeQuery.html">executeQuery</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/executeUpdate.html">executeUpdate</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/exists.html">exists</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/fetchMode.html">fetchMode</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/find.html">find</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/findAll.html">findAll</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/findAllBy.html">findAllBy</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/findAllWhere.html">findAllWhere</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/findBy.html">findBy</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/findOrCreateBy.html">findOrCreateBy</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/findOrCreateWhere.html">findOrCreateWhere</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/findOrSaveBy.html">findOrSaveBy</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/findOrSaveWhere.html">findOrSaveWhere</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/findWhere.html">findWhere</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/first.html">first</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/get.html">get</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/getAll.html">getAll</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/getDirtyPropertyNames.html">getDirtyPropertyNames</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/getPersistentValue.html">getPersistentValue</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/hasErrors.html">hasErrors</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/hasMany.html">hasMany</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/hasOne.html">hasOne</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/ident.html">ident</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/instanceOf.html">instanceOf</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/isAttached.html">isAttached</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/isDirty.html">isDirty</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/last.html">last</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/list.html">list</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/listOrderBy.html">listOrderBy</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/load.html">load</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/lock.html">lock</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/mapWith.html">mapWith</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/mappedBy.html">mappedBy</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/mapping.html">mapping</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/merge.html">merge</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/namedQueries.html">namedQueries</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/properties.html">properties</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/read.html">read</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/refresh.html">refresh</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/removeFrom.html">removeFrom</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/save.html">save</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/transients.html">transients</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/validate.html">validate</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/where.html">where</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/whereAny.html">whereAny</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/withCriteria.html">withCriteria</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/withNewSession.html">withNewSession</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/withSession.html">withSession</a>
</div>
<div class="menu-item"><a href="../ref/Domain%20Classes/withTransaction.html">withTransaction</a>
</div>
</div>
</div>
<div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Plug-ins</h1><div class="menu-sub">
<div class="menu-item"><a href="../ref/Plug-ins/Usage.html">Usage</a></div>
<div class="menu-item"><a href="../ref/Plug-ins/URL%20mappings.html">URL mappings</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/codecs.html">codecs</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/controllers.html">controllers</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/core.html">core</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/dataSource.html">dataSource</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/domainClasses.html">domainClasses</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/hibernate.html">hibernate</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/i18n.html">i18n</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/logging.html">logging</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/scaffolding.html">scaffolding</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/services.html">services</a>
</div>
<div class="menu-item"><a href="../ref/Plug-ins/servlets.html">servlets</a>
</div>
</div>
</div>
<div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Services</h1><div class="menu-sub">
<div class="menu-item"><a href="../ref/Services/Usage.html">Usage</a></div>
<div class="menu-item"><a href="../ref/Services/scope.html">scope</a>
</div>
<div class="menu-item"><a href="../ref/Services/transactional.html">transactional</a>
</div>
</div>
</div>
<div class="menu-block"><h1 class="menu-title" onclick="toggleRef(this.parentNode.childNodes[1])">Servlet API</h1><div class="menu-sub">
<div class="menu-item"><a href="../ref/Servlet%20API/request.html">request</a>
</div>
<div class="menu-item"><a href="../ref/Servlet%20API/response.html">response</a>
</div>
<div class="menu-item"><a href="../ref/Servlet%20API/servletContext.html">servletContext</a>
</div>
<div class="menu-item"><a href="../ref/Servlet%20API/session.html">session</a>
</div>
</div>
</div>
</div>
</div>
</td>
</tr>
</table>
<div id="footer">
Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright Notice, whether distributed in print or electronically.
</div>
<script type="text/javascript" src="../js/docs.js"></script>
</body>
</html>