配置和注入Grails服务

时间:2015-10-06 09:44:27

标签: grails service dependency-injection

Grails 2.4.5。我做了grails create-service com.example.service.Simple为我创建了一个SimpleService,然后我将其修改为:

class SimlpeService {
    SimpleClient simpleClient

    Buzz doSomething(String derp) {
        // ...
        Fizz fizz = simpleClient.doSomething(derp)
        // ...
        fizz.asBuzz()
    }
}

我现在可以像SimpleService那样“注入”控制器:

class MyController {
    SimpleService simpleService

    def index() {
        // etc...
    }
}

但是如何使用正确的SimpleService实例配置/连接SimpleClient。让我们假装SimpleClient通常是这样构建的:

SimpleClient simpleClient = SimpleClientBuilder
    .withURL('http://simpleclientdev.example.com/simple')
    .withAuth('luggageCombo', '12345')
    .isOptimized(true)
    .build()

根据我所处的环境,我可能希望我的SimpleClient个实例连接到simpleclientdev.example.comsimpleclientqa.example.com,甚至是simpleclient.example.com。此外,我可能会使用不同的身份验证凭据,我可能/可能不希望它“优化”等。重点是:如何将SimpleService注入SimpleClient个实例吗

2 个答案:

答案 0 :(得分:1)

您可以在服务中的某个方法上使用Java的PostConstruct注释来执行您想要的操作。来自文档:

  

PostConstruct注释用于需要的方法   在完成依赖注入以执行任何操作之后执行   初始化。

<强> SimpleService.groovy

import javax.annotation.PostConstruct

class SimlpeService {

    private SimpleClient simpleClient

    def grailsApplication

    @PostConstruct
    void postConstruct() {
        def config = grailsApplication.config.client.data

        SimpleClient simpleClient = SimpleClientBuilder
            .withURL(config.url)
            .withAuth('luggageCombo', config.username)
            .isOptimized(config.optimized)
            .build()
    }

    Buzz doSomething(String derp) {
        // ...
        Fizz fizz = simpleClient.doSomething(derp)
        // ...
        fizz.asBuzz()
    }
}

因此,当解析此服务的所有依赖项(在本例中为postConstruct())并调用任何服务方法时,Grails或Spring将自动调用此方法grailsApplication。 在访问SimpleService的任何字段成员或方法之前,已经注意了必须方法。

现在,所有内容都已按您提到的配置,您可能需要使用不同的凭据调用不同的网址,只需在Config.groovy中将其定义为:

environments {
    development {
        client {
            data {
                url = "simpleclientdev.example.com"
                username = "test"
                optimized = false
            }
        }
    }
    production {
        client {
            data {
                url = "simpleclient.example.com"
                username = "johndoe"
                optimized = true
            }
        }
    }
}

现在当你使用开发模式进行run-app并在示例控制器中调用simpleService.doSomething()时,会自动使用测试凭据点击simpleclientdev.example.com URL,并在使用生产环境部署它时,同样当simpleService.doSomething()设置为simpleclient.example.com时,optimized方法会点击true

<强>更新 这里的关键点是你的问题是我们不会注入SimpleService的不同实例,因为默认情况下服务是单例。相反,我们正在根据环境更改与服务关联的值。

答案 1 :(得分:0)

听起来你需要更多地了解如何利用Spring? Grails Spring Docs

您也可以在服务类

中执行此类操作
 @PostConstruct
void init() {
    //configure variables, etc here ...
    log.debug("Initialised some Service...")
}