加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 05:48:24 所属栏目:Java 来源:网络整理
导读:我只是想了解一下 Java如何在JRE中包含标准参考实现(例如JRE6中的JAXB / JAX-WS),同时仍然允许第三方实现覆盖它(例如CXF). 我找到了找到javax.xml.ws.spi.FactoryFinder.find()方法的地方,该方法可以找到META-INF / services / java.xml.ws.spi.Provider或co
我只是想了解一下 Java如何在JRE中包含标准参考实现(例如JRE6中的JAXB / JAX-WS),同时仍然允许第三方实现覆盖它(例如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()方法的时间/位置/在哪个阶段.

任何人都可以开导我吗?

[编辑]我找到了答案,但我不允许自己发布另外3个小时……

解决方法

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

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

假设我们想要使用以下代码调用Web服务:

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

port.mymethod();

然后,以下事件初始化JAX-WS实现:

>任何JAX-WS Web服务都扩展了javax.xml.ws.Service,因此MyService_Service扩展了Service
>当您创建Web服务的实例时,其超类(javax.xml.ws.Service)也会被初始化(构造函数)
>“Service”的构造函数调用javax.xml.ws.spi.Provider.provider(),这是一个静态方法,它使用javax.xml.ws.spi.FactoryFinder.find()来查找并实例化已实现的实现.

假设我们想要使用以下代码发布Web服务:

@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()来查找并实例化已配置的实现.

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

> http://kickjava.com/src/javax/xml/ws/Service.java.htm
> http://kickjava.com/src/javax/xml/ws/spi/Provider.java.htm
> http://kickjava.com/src/javax/xml/ws/Endpoint.java.htm>(除了研究由Apache CXF的wsdl2java生成的源文件)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读