在 Spring 功能性 bean 定义 DSL 中访问 InjectionPoint

End*_*eit 5 java dsl spring kotlin spring-boot

我们使用 Bean 工厂函数来允许将 Logger 对象注入到我们的 Bean 中。这看起来类似于 Simar Paul Singh 在他的文章“ Inject loggers in Spring ”中描述的内容

import org.slf4j.*
import org.springframework.beans.factory.InjectionPoint
import org.springframework.context.annotation.*

@Bean
@Scope("prototype")
fun logger(injectionPoint: InjectionPoint): Logger {
  return LoggerFactory.getLogger(
      injectionPoint.methodParameter?.containingClass // constructor
          ?: injectionPoint.field?.declaringClass // or field injection
  )
}
Run Code Online (Sandbox Code Playgroud)

今天我尝试使用Springs 功能性 bean 定义 DSL将此声明转换为 Bean 声明。然而,我没有成功地获取InjectionPoint用于检索记录器注入的类的信息。

import org.slf4j.*
import org.springframework.beans.factory.InjectionPoint
import org.springframework.context.support.beans
import org.springframework.context.support.BeanDefinitionDsl.Scope.PROTOTYPE

fun beans() = beans {
    bean(scope = PROTOTYPE) {
        val injectionPoint = ref<InjectionPoint>()
    
        LoggerFactory.getLogger(
            injectionPoint.methodParameter?.containingClass // constructor
                ?: injectionPoint.field?.declaringClass // or field injection
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的结果是这样的异常:

NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.beans.factory.InjectionPoint' available
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以检索该类InjectionPoint或至少检索该类,以提供与 Bean 声明类似的行为,而无需 DSL?

可以在GitHub上找到最小复制存储库。在 Windows 上运行./gradlew bootRun.\gradlew.bat bootRun来重现该错误。


我已经在 Spring 的 GitHub 存储库上打开了问题 #27738 。

Raj*_*shi 0

我不是 Kotlin 专家,但你能尝试一下吗

fun beans() = beans {
    bean<InjectionPoint>()
    bean(scope = PROTOTYPE) {
        val injectionPoint = ref<InjectionPoint>()
    
        LoggerFactory.getLogger(
            injectionPoint.methodParameter?.containingClass // constructor
                ?: injectionPoint.field?.declaringClass // or field injection
        )
    }
}
Run Code Online (Sandbox Code Playgroud)