我只是想了解一下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();
Run Code Online (Sandbox Code Playgroud)
然后,以下事件初始化JAX-WS实现:
假设我们想要使用以下代码发布 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();
Run Code Online (Sandbox Code Playgroud)
然后,以下事件初始化JAX-WS实现:
以下链接帮助我理解了这一点:
您可以使用系统属性更改默认行为javax.xml.bind.context.factory。它的值应该是工厂的完全限定类名。
该属性的默认值为com.sun.xml.internal.bind.v2.ContextFactory。该工厂不需要实现任何特定接口,但它必须实现方法createContext(String, ClassLoader, Map)
| 归档时间: |
|
| 查看次数: |
7689 次 |
| 最近记录: |