与仅使用生成的客户端类相比,使用带有JAX-WS服务的动态客户端有什么好处?有什么缺点?
**对于我的特殊情况,我使用的是Apache CXF,我不确定其他库是否允许“动态”客户端。
- 我认为我不需要添加它,但是......我正在寻找非显而易见的(我知道......主观的)优点。我不需要别人告诉我不使用生成的类的优点是我不需要生成类。
答案 0 :(得分:7)
嗯,CXF文档很清楚Dynamic Clients的优点:
CXF支持多种替代方案,允许应用程序在没有SEI和数据类的情况下与服务进行通信。 JAX-WS指定了JAX-WS Dispatch API,以及用于读取和写入XML的Provider接口。但是,此页面描述了CXF的动态客户端工具。对于动态客户端,CXF在运行时生成SEI和bean类,允许您通过使用对象的API调用操作,或使用反射调用完整代理。
换句话说,您不需要类的定义,如下面的文档示例所示:
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient("echo.wsdl");
Object[] res = client.invoke("echo", "test echo");
System.out.println("Echo response: " + res[0]);
关于缺点,它们非常明显(这是付出的代价):你正在操纵字符串,你失去了强烈的打字。
答案 1 :(得分:2)
优点是避免生成和包含代码。在某些环境中,这是一个问题。如果您的环境中没有包含生成代码的障碍,那么动态客户端是一个坏主意,速度更慢,更麻烦。
动态客户端速度较慢,因为代码(我写了一些代码)必须:
它更麻烦,因为您的数据模型中没有任何复杂对象的bean类。你需要使用反射。
请记住,动态客户端与调用接口不同。
答案 2 :(得分:1)
使用动态客户端的优点是您不需要在运行时之前生成存根。这允许您通常在运行时调用您可能不知道的服务。
答案 3 :(得分:1)
如果您准确了解客户端代码将要调用的Web服务以及在客户端的生命周期内不会发生更改,则生成的客户端类很棒。
如果其中任何一种情况不是这样,那么您需要考虑客户如何处理这些情况。 Dispatch API使您可以灵活地动态生成Web服务调用,而无需熟悉所访问的服务。 这显然需要代码来支持构建该调用所需的配置选项。
总而言之,服务器端接口的开发人员/维护人员承担了一定的责任,不会引入会破坏客户端代码的更改。
答案 4 :(得分:1)
前几天我与同事进行了类似的谈话。他正在使用Spring客户端,它需要使用一个接口来编译客户端,然后Spring注入实际代码以使接口工作。它基本上归结为我们之间最古老的锯,像动态代理这样的东西通常会引入某种性能税,他没关系,我开始写生活中的设备驱动程序,所以我对速度有着极大的偏见。就我而言,更快/更小的胜利,因为我不受限于这种有限的环境......我的Droid手机让我所有的系统工作,包括大型机,在我的前10年专业看起来微不足道,我会站在速度的一边。对此的共同反驳是,还有许多其他瓶颈是“真正的”问题,而且这个问题对他们来说微不足道......而且可能是真的......但每一点点都有帮助。如果你从Steve Souders和他的同胞那里读到的东西......用户可以注意到短至400毫秒的变化......他们并不一定注意到事情变慢了,但他们的反应是不同的。因为我无法对网络速度,数据库索引开销等做任何事情,所以我至少可以用我可以影响的事情做最好的工作。 呼!对不起'那个!!现在就离开肥皂盒吧! ;)
答案 5 :(得分:1)
DII(Dynamic Invocation Interface) Client:使用DII,即使远程过程的签名或服务名称在运行时未知,客户端也可以调用远程过程。
由于其灵活性,可以在服务代理中使用DII客户端,以动态发现服务,配置远程调用并执行调用。
<强>优点强>
缺点