为什么feign动态代理不需要接口实现类?
feign动态代理是基于jdk动态代理来实现的:
所以按照模型 应该有feignClien接口类 + feignClient接口业务实现类 + InvocationHandler实现类, 我猜想 feign源码里会有InvocationHandler实现类, 但是feignClient接口业务实现类应该不是源码中某个类,而编写代码时也不需要提供这个实现类, 那feign究竟是怎么做到的呢?
按照上图,源码中Proxy.newInstance()返回的应该是业务接口实现类2的代理类4,常规的feign调用,是只需要开发提供业务接口1,那2是何时生成的?或者说为什么可以不提供2
回答:
你猜想的很对,feign既然是jdk代理,最终执行的就是InvocationHandler,首先要知道一点,像mybatis,feign,jpa这种,直接注入接口的,交给容器管理以后,都是FactoryBean去生成运行时bean,feign的话,则是FeignClientFactoryBean,看一下它的getObject方法
--
public void saveClassFile(Class clazz,String proxyName) {
//生成class的字节数组,此处生成的class与proxy.newProxyInstance中生成的class除了代理类的名字不同,其它内容完全一致 byte[] classFile = ProxyGenerator.generateProxyClass(proxyName, new Class[]{clazz});
String path = clazz.getResource(".").getPath();
try( FileOutputStream fos = new FileOutputStream(path + proxyName + ".class")) {
fos.write(classFile);//保存到磁盘
fos.flush();
}catch(Exception e) {
e.printStackTrace();
}
}
回答:
按照一楼大佬的说法,在源码的这一步找到了feign生成的业务接口实现类,发现他的名称也是类似于Proxy0
另外通过以下方式没有拿到字节码,明天再做进一步的验证:
Object obj= getTarget();
byte[] bytes = null;
try {
// object to bytearray ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(obj);
bytes = bo.toByteArray();
bo.close();
oo.close();
} catch (Exception e) {
System.out.println("translation" + e.getMessage());e.printStackTrace();
}
FileOutputStream fos = new FileOutputStream(new File("Test.class"));fos.write(bytes);
fos.flush();
fos.close();
4.5:尝试了一些方式都无法在debug时,将getTarget返回的对象转字节码, 还是无法完成最终的验证。 这个问题演变成了源码中返回的对象究竟是业务接口实现类 还是业务接口代理实现类?
以上是 为什么feign动态代理不需要接口实现类? 的全部内容, 来源链接: utcz.com/p/944332.html