1.在Domain对象中获取Spring applicationContext的方式:
class Book{
def test(){
def applicationContext = domainClass.grailsApplication.mainContext
}
}
2.在resources.groovy中 使用Spring SpEL
beans = {
bar(Bar)
foo(Foo) {
name = '#{bar.name}'
}
}
beans = {
bar(Bar)
foo(Foo) {
name = '#{bar.resourceName()}'
}
}
3.使用 Property Placeholder
在grails-app/conf/Config.groovy 中配置
database.driver="com.mysql.jdbc.Driver"
database.dbname="mysql:mydb"
在resources.groovy使用上面配置
dataSource(org.springframework.jdbc.datasource.DriverManagerDataSource) {
driverClassName = '${database.driver}'
url = 'jdbc:${database.dbname}'
}
4.运行时依赖注入
import org.springframework.beans.factory.config.AutowireCapableBeanFactory
...
def instance = new XXX(...)
def ctx = grailsApplication.mainContext
ctx.beanFactory.autowireBeanProperties(instance,
AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, false)
这时候instance 对象的属性跟 Spring 对应同名 bean 关联起来
5.Bean生命周期配置
在resources.groovy中
authenticationManager(com.mycompany.myapp.LdapAuthenticationManager) { bean ->
serverUrl = '...'
password = '...'
bean.initMethod = 'init'
bean.destroyMethod = 'destroy'
}
或者在实现 InitializingBean、DisposableBean接口
package com.mycompany.myapp
import org.springframework.beans.factory.DisposableBean
import org.springframework.beans.factory.InitializingBean
class LdapAuthenticationManager implements InitializingBean, DisposableBean {
void afterPropertiesSet() {
// initialization work
}
void destroy() {
// shutdown work
}
}
6.Bean 别名
import grails.util.Environment
beans = {
String realBeanName
switch (Environment.current) {
case Environment.TEST:
realBeanName = 'testCardProcessingService'
break
case Environment.PRODUCTION:
realBeanName = 'productionCardProcessingService'
break
default: // Environment.DEVELOPMENT, custom envs
realBeanName = 'mockCardProcessingService'
break
}
springConfig.addAlias 'cardProcessingService', realBeanName
}
7.Resource 依赖注入
普通类
package com.mycompany.myapp
import org.springframework.core.io.Resource
class FooManager {
Resource xmlFile
// class methods
}
配置
import com.mycompany.myapp.FooManager
beans = {
fooManager(FooManager) {
xmlFile = 'classpath:data.xml'
}
}
8.在resources.groovy中使用Spring命名空间
xmlns context:"http://www.springframework.org/schema/context"
context.'component-scan'('base-package': "my.company.domain")