Grails 技巧 - Grails and Spring

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")

你可能感兴趣的:(grails)