Grails 技巧 - Grails and Spring

1.在Domain對象中獲取Spring applicationContext的方式:mysql

class Book{

    def test(){
        def applicationContext = domainClass.grailsApplication.mainContext
    }
}

2.在resources.groovy中 使用Spring SpELspring

beans = {
    bar(Bar)
    foo(Foo) {
        name = '#{bar.name}'
    }
}

beans = {
    bar(Bar)
    foo(Foo) {
        name = '#{bar.resourceName()}'
    }
}

3.使用 Property Placeholdersql

在grails-app/conf/Config.groovy 中配置app

database.driver="com.mysql.jdbc.Driver"
database.dbname="mysql:mydb"

在resources.groovy使用上面配置dom

dataSource(org.springframework.jdbc.datasource.DriverManagerDataSource) {
    driverClassName = '${database.driver}'
    url = 'jdbc:${database.dbname}'
}

4.運行時依賴注入url

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 關聯起來spa

5.Bean生命週期配置code

在resources.groovy中component

authenticationManager(com.mycompany.myapp.LdapAuthenticationManager) { bean ->
    serverUrl = '...'
    password = '...'
    bean.initMethod = 'init'
    bean.destroyMethod = 'destroy'
}

或者在實現 InitializingBean、DisposableBean接口server

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")
相關文章
相關標籤/搜索