Written on
Grails: Splitting resources.groovy
Grails provides a neat way to specify Spring bean definitions with its custom Beans DSL [0]. The bean definition is found ingrails-app/conf/spring/resources.groovy
:
beans = {
myBean(SomeBeanClass) {
someProperty = ref('someReference')
}
// ...
}
<beans:beans
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<beans:bean id="myBean" class="org.ast.beans.SomeBeanClass">
<beans:property name="someProperty" ref="someReference" />
</beans:bean>
<!-- ... -->
</beans:beans>
grails-app/conf/spring/resources.xml
.
Grails watches resources.groovy
and resources.xml
for changes and reloads them at runtime if necessary.
Splitting up with Bean XML files
As the bean definition count raises, it is preferable to splitresources.groovy
into separate bean definition files. Using Spring's bean definition XML this can be done via the <beans:import/>
XML tag:
<beans:beans
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<beans:import resource="common.xml"/>
<beans:import resource="job-definitions.xml"/>
<!-- ... -->
</beans:beans>
Splitting up in Beans DSL
So far for XML bean definition files, but what about splittingresources.groovy
into separate groovy definitions?
Since Grails 1.2, there is a way to do this (although not explicitly documented in the Grails reference documentation). Grails' Beans DSL is interpreted via a grails.spring.BeanBuilder
instance which in turn provides method
public void importBeans(String resourcePattern) {
// ...
}
beans = {
importBeans('file:grails-app/conf/spring/common.xml)
importBeans('file:grails-app/conf/spring/job-definitions.xml)
importBeans('file:grails-app/conf/spring/integration.groovy)
// ...
}
String
parameter of importBeans
might be an arbitrary resource pattern which is resolved at runtime using Spring's org.springframework.core.io.support.ResourcePatternResolver
, e.g. it would be possible to import multiple XML and/or groovy files using '*' like:
importBeans('file:grails-app/conf/spring/*.xml)
[0] Grails Beans DSL