gpt4 book ai didi

grails - 配置和注入(inject) Grails 服务

转载 作者:行者123 更新时间:2023-12-02 14:41:31 25 4
gpt4 key购买 nike

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“注入(inject)” Controller 像这样:
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.com 的实例, simpleclientqa.example.com , 甚至 simpleclient.example.com .此外,我可能会使用不同的身份验证凭据,并且我可能/可能不希望它被“优化”等。重点是: 如何注入(inject) SimpleServiceSimpleClient实例?

最佳答案

您可以使用 Java 的 PostConstruct在您的服务中对您的一种方法进行注释以执行您想要的操作。从文档:

The PostConstruct annotation is used on a method that needs to be executed after dependency injection is done to perform any initialization.



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()
}
}

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

现在,一切都已经像您提到的那样配置好了,您可能需要使用不同的凭据调用不同的 URL,只需在 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()在您的示例 Controller 中,将自动点击 simpleclientdev.example.com带有测试凭据的 URL,当您使用生产环境部署它时,相同的 simpleService.doSomething()方法将命中 simpleclient.example.comoptimized设置为 true .

更新
根据您的问题,这里的关键点是我们不会注入(inject) SimpleService 的不同实例。因为服务默认是单例的。相反,我们正在根据环境更改与服务关联的值。

关于grails - 配置和注入(inject) Grails 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32966754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com