gpt4 book ai didi

java - Java 如何初始化 JAXB/JAX-WS/etc 实现?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:56:42 24 4
gpt4 key购买 nike

我只是想深入了解一下 Java 如何在 JRE 中包含标准引用实现(例如 JRE6 中的 JAXB/JAX-WS),同时仍然允许第 3 方实现覆盖它(例如 CXF) .

我已经到了找到 javax.xml.ws.spi.FactoryFinder.find() 方法的地方,它可以找到 META-INF/services/java.xml.ws.spi.Provider 中指定的类或 com.sun.xml.internal.ws.spi.ProviderImpl(对于 JAX-WS 案例)并创建其实例。

我找不到的是 JRE 如何/在何处/在哪个阶段调用 FactoryFinder.find() 方法。

谁能教教我?

[edit] 我找到了答案,但我不能再过 3 小时自己发布它...

最佳答案

找出完整的逻辑。实际上 JVM 启动时没有任何反应。这一切都基于延迟加载,例如,真正的 JAX-WS/任何提供者仅在第一次需要时加载/实例化。

在加载 JAX-WS 实现的情况下:

假设我们想要调用一个网络服务,使用如下代码:

MyService     service = new MyService_Service();
MyServiceSoap port = service.getMyServiceSoap();

port.mymethod();

然后发生以下情况以初始化 JAX-WS 实现:

  • 任何 JAX-WS 网络服务都扩展了 javax.xml.ws.Service,因此 MyService_Service 扩展了服务
  • 当您创建 Web 服务的实例时,它的父类(super class) (javax.xml.ws.Service) 也会被初始化(构造函数)
  • “服务”的构造函数调用 javax.xml.ws.spi.Provider.provider(),这是一个使用 javax.xml.ws.spi.FactoryFinder.find() 查找和实例化实现的静态方法按照配置。

假设我们要使用如下代码发布网络服务:

@WebService(endpointInterface = "my.package.MyService")
public class MyServiceImp implements MyService {
...
}

MyServiceImp service = new MyServiceImp();
InetSocketAddress addr = new InetSocketAddress(8080);
Executor executor = Executors.newFixedThreadPool(16);
HttpServer server = new HttpServer(addr);
server.setExecutor(executor);

HttpContext context = server.createContext("/MyService");
Endpoint endpoint = Endpoint.create(service);
endpoint.publish(context);
server.start();

然后发生以下情况以初始化 JAX-WS 实现:

  • Endpoint.create() 运行 Provider.provider().createEndpoint()
  • Provider.provider() 是一种静态方法,它使用 javax.xml.ws.spi.FactoryFinder.find() 来查找和实例化配置的实现。

以下链接帮助我理解了这一点:

关于java - Java 如何初始化 JAXB/JAX-WS/etc 实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8692865/

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