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 。
我不是 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)
归档时间: |
|
查看次数: |
574 次 |
最近记录: |