gpt4 book ai didi

spring - 如何在抽象类方法中访问注入(inject)的 Grails bean?

转载 作者:行者123 更新时间:2023-12-03 19:49:01 25 4
gpt4 key购买 nike

我有一个抽象类,它实现了由大量注册为 bean 的具体类继承的大部分功能。 bean 是在启用 Autowiring 的情况下定义的。例如:

abstract class MyAbstract {

MyService myService
MyBean myBean

def doSomething() {
def value = myService.something(myBean)
}
}


class MyConcrete extends MyAbstract {
def concreteField

def doSomethingElse() {
def value = myService.somethingElse(myBean)
}
}

conf/spring/resources.groovy:

myConcrete(MyConcrete) { bean ->
bean.autowire = true
myBean = ref(MySpecificBeanImpl)
}

我的问题:

当我在 MyConcrete 实例中运行方法 doSomethingElse 时,一切都按预期工作,并且 myService 和 myBean 值由 DI 填充了正确的值。当我在 MyConcrete 实例中执行 doSomething 方法时,myService 和 myBean 值都为空。看起来DI值在子类继承的抽象方法中是不可见的。这真的很糟糕。

我可以在方法中使用上下文持有者手动访问值,或者我可以使用接受这些值作为参数的修改后的方法签名将值从子类传递到抽象父类,但这些都不是好的解决方案。它完全破坏了抽象类实现的实用性,并且需要大量我不想维护的重复代码。

更糟糕的是,在我的特定情况下,myBean 的值对于每个具体类来说实际上是不同的,明确地连接到 resources.groovy 文件中,因此通用持有者方法不起作用。

我浏览了许多与此相关的帖子,包括 Grails services in abstract class没有太多结果可以弄清楚发生了什么。抽象bean定义似乎是关于抽象bean定义属性,与抽象类和子类继承没有任何关系。

(1) 这是 Grails/Spring DI 支持的限制吗?(2) 对于抽象类,我还需要做些什么吗?

最佳答案

您遗漏了一些细节,我不得不做出一些假设,但我已经创建了一个与您所描述的内容类似的应用程序。该项目位于 https://github.com/jeffbrown/abstractbeanmethods包含以下内容并且似乎有效:

src/groovy/demo/MyAbstract.groovy 封装演示

abstract class MyAbstract {

MyService myService
MyBean myBean

def doSomething() {
myService.something(myBean)
}
}

src/groovy/demo/MyConcrete.groovy

package demo

class MyConcrete extends MyAbstract {
def doSomethingElse() {
def value = myService.somethingElse(myBean)
}
}

grails-app/conf/spring/resources.groovy

// Place your Spring DSL code here
beans = {
myBeanImpl demo.MySpecificBeanImpl

myConcrete(demo.MyConcrete) { bean ->
bean.autowire = true
myBean = ref('myBeanImpl')
}
}

src/groovy/demo/MySpecificBeanImpl.groovy 封装演示

class MySpecificBeanImpl implements MyBean {
}

src/groovy/demo/MyBean.groovy

package demo

interface MyBean {}

grails-app/service/demo/MyService.groovy 封装演示

class MyService {

def something(MyBean bean) {
"Bean class name is ${bean.class.name} in MyService.something() method"
}
def somethingElse(MyBean bean) {
"Bean class name is ${bean.class.name} in MyService.somethingElse() method"
}
}

grails-app/controllers/demo/DemoController.groovy 封装演示

class DemoController {
def myConcrete
def index() {
def sb = new StringBuffer()
sb << myConcrete.doSomething()
sb << " and "
sb << myConcrete.doSomethingElse()
render sb
}
}

您可能会发现那里的某事与您正在做的某事之间存在一些显着差异。如果您可以隔离该示例应用中的问题场景,或提供代码的可运行版本,那么我很乐意为您解决问题。

关于spring - 如何在抽象类方法中访问注入(inject)的 Grails bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25774828/

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