gpt4 book ai didi

java - 如何注入(inject)实现在 Java 或 Groovy 代码中调用的接口(interface)方法的类?

转载 作者:行者123 更新时间:2023-12-02 13:59:55 28 4
gpt4 key购买 nike

我有以下来自 Spring 框架项目的工作 groovy 代码:

import org.springframework.oxm.Unmarshaller

public class ItemSearchService {
Unmarshaller unmarshaller;
public ItemSearchResponse getObject(InputStream xml) {

ItemSearchResponse its = null;
try {
its = (ItemSearchResponse) unmarshaller.unmarshal(new StreamSource(xml));
} finally {
}
return its;
}
}
Unmarshaller.unmarshall 实际上是接口(interface)方法:
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/oxm/Unmarshaller.html
Unmarshaller 接口(interface)由几个类实现。
谁决定在运行时注入(inject)哪个实现类以及它如何决定使用哪个类?
Spring IoC 机制可以做到这一点吗?如果是这样,它是在生成 jar 时在构建时选择一个特定的实现类,还是在运行时选择一个特定的实现类?
另外如何知道它实际使用了哪个实现类?
假设类路径中的依赖 jars,上面的代码会在 Spring 之外的普通 Java 文件中工作吗?

最佳答案

一旦涉及 Grails 项目(不是纯 Spring 项目),就应该澄清一些事情。

Who decides which implementing class to inject during runtime and how it decides which class to use? Does Spring IoC mechanism does this? If so does it pick up one specific implementing class during build time when jar is generated or it does it during run time?


@svr 的答案和 Internet 上的其他文档很好地描述了 Spring 在普通 Spring(Boot) 中所做的事情,但与您的案例没有太大关系。
在 Grails 中使用约定优于配置的原则,这意味着
  • 默认情况下 Bean Autowiring 处于 Activity 状态
  • 只有被声明为 Grails 人工制品的 bean,例如 Service是自动注入(inject)的。

  • 通常,如果你想 Autowiring 其他原型(prototype)的 bean,你必须在某个地方声明它,否则 Grails 中的 Spring IoC 容器根本找不到它。
    你应该检查你的 grails-app/conf/spring resources.groovy 的文件夹(或者可能是 yaml 或 xml 文件,具体取决于版本)并查看您的 unmarshaller bean 在那里定义。它应该看起来像:
    beans = {
    unmarshaller Unmarshaller ....
    }
    所以,基本上 Unmarshaller 的实现有多少并不重要。接口(interface)存在于所有项目的 jar 文件中。唯一重要的是您的 resources.groovy 中定义的内容。 .
    如果你想在运行时检查 bean 的类,只需在你的服务中记录它的类:
    class ItemSearchService  {
    Unmarshaller unmarshaller
    ItemSearchResponse getObject(InputStream xml) {
    log.info "unmarshaller's class is $unmarshaller.class"
    // or
    // println "unmarshaller's class is $unmarshaller.class"
    }
    }

    关于java - 如何注入(inject)实现在 Java 或 Groovy 代码中调用的接口(interface)方法的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64515471/

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