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.com
,simpleclientqa.example.com
,甚至是simpleclient.example.com
。此外,我可能会使用不同的身份验证凭据,我可能/可能不希望它“优化”等。重点是:如何将SimpleService
注入SimpleClient
个实例吗
答案 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...")
}