独立应用feign能够帮助我们解决什么样的问题或者带来什么好处呢。一方面是优雅,优雅的代码总是具有更好的可读性,这将意味着可能具有更好的维护性。另一方面是独立,独立意味着它可以不依赖繁琐的框架,意味着能够在更多的环境中得到应用。

1、建立一个基于maven的普通的Java项目,pom.xml配置如下

<dependencies><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-core</artifactId><version>9.7.0</version></dependency><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-gson</artifactId><version>9.7.0</version></dependency>
</dependencies>

2、使用到的一些注解

FeignService.java
package com.suntown.annotation;import java.lang.annotation.*;@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FeignService{}

Url.java

package com.suntown.annotation;import java.lang.annotation.*;@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Url{public String value();
}

Wired.java

package com.suntown.annotation;import java.lang.annotation.*;@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Wired{}

3自动扫描package并管理feign接口类

FeignJust.java
package com.suntown;import com.suntown.annotation.FeignService;
import com.suntown.annotation.Url;
import com.suntown.annotation.Wired;
import feign.Feign;
import feign.Request;
import feign.Retryer;
import feign.gson.GsonDecoder;
import feign.gson.GsonEncoder;
import sun.net.www.protocol.file.FileURLConnection;import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.lang.reflect.Field;
import java.net.JarURLConnection;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;public class FeignJust{private static Map<Class,Object> actionMap = new HashMap<>();private static Map<Class,Object> feignServiceMap = new HashMap<>();public static <T> T getAction(Class<T> interClass){return (T) actionMap.get(interClass);}public static <T> T action(Class<T> tClass,String url){T action = Feign.builder().encoder(new GsonEncoder()).decoder(new GsonDecoder()).options(new Request.Options(1000, 3500)).retryer(new Retryer.Default(5000, 5000, 3)).target(tClass,url);return action;}public static String firstLower(String s){return (char)(s.charAt(0) + 32) + s.substring(1);}public static void scanPackage(String packageName) {try {String packageNamePath = packageName.replace(".","\\");URL url = FeignJust.class.getResource("FeignJust.class");URLConnection urlConnection = url.openConnection();if(urlConnection instanceof FileURLConnection){FileURLConnection fileURLConnection = (FileURLConnection)urlConnection;File rootFile = new File(FeignJust.class.getResource("/").toURI().getPath());File dirFile = new File(rootFile.getAbsolutePath() + File.separator + packageNamePath);File[] classesFile = dirFile.listFiles(new FilenameFilter() {@Overridepublic boolean accept(File file, String s) {return s.endsWith(".class");}});for(File classFile : classesFile){String classFilePath = classFile.getAbsolutePath();String className = classFilePath.substring(rootFile.getAbsolutePath().length() + 1).replace("\\",".");className = className.substring(0,className.length() - 6);Class interClass = FeignJust.class.getClassLoader().loadClass(className);Url urlAno = (Url)interClass.getAnnotation(Url.class);if(urlAno!=null){Object action = FeignJust.action(interClass,urlAno.value());String classSimpleName = firstLower(interClass.getSimpleName());actionMap.put(interClass,action);}}}else if(urlConnection instanceof JarURLConnection){JarURLConnection jarURLConnection = (JarURLConnection)urlConnection;URL jarFileURL = jarURLConnection.getJarFileURL();File fileJarFile = new File(jarFileURL.toURI().getPath());JarFile jarFile = jarURLConnection.getJarFile();Enumeration<JarEntry> it = jarFile.entries();while(it.hasMoreElements()){String className = it.nextElement().getName().replace("/",".");if(className.endsWith(".class") && className.startsWith(packageName + ".")){className = className.substring(0,className.length() - 6);Class interClass = FeignJust.class.getClassLoader().loadClass(className);Url urlAno = (Url)interClass.getAnnotation(Url.class);if(urlAno!=null){Object action = FeignJust.action(interClass,urlAno.value());String classSimpleName = firstLower(interClass.getSimpleName());actionMap.put(interClass,action);}}}}} catch (IOException e) {e.printStackTrace();} catch (URISyntaxException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}public static <T> T getService(Class<T> interClass) {return (T) feignServiceMap.get(interClass);}public static void scanServicePackage(String packageName) {try {String packageNamePath = packageName.replace(".","\\");URL url = FeignJust.class.getResource("FeignJust.class");URLConnection urlConnection = url.openConnection();if(urlConnection instanceof FileURLConnection){FileURLConnection fileURLConnection = (FileURLConnection)urlConnection;File rootFile = new File(FeignJust.class.getResource("/").toURI().getPath());File dirFile = new File(rootFile.getAbsolutePath() + File.separator + packageNamePath);File[] classesFile = dirFile.listFiles(new FilenameFilter() {@Overridepublic boolean accept(File file, String s) {return s.endsWith(".class");}});for(File classFile : classesFile){String classFilePath = classFile.getAbsolutePath();String className = classFilePath.substring(rootFile.getAbsolutePath().length() + 1).replace("\\",".");className = className.substring(0,className.length() - 6);Class interClass = FeignJust.class.getClassLoader().loadClass(className);FeignService feignService = (FeignService)interClass.getAnnotation(FeignService.class);if(feignService!=null){Object serivce = FeignJust.serivce(interClass);String classSimpleName = firstLower(interClass.getSimpleName());if(serivce!=null){Field[] fields = interClass.getDeclaredFields();for(Field field : fields){if(field.getAnnotation(Wired.class)!=null){field.setAccessible(true);Object action = getAction(field.getType());if(action!=null){field.set(serivce,action);}}}feignServiceMap.put(interClass, serivce);}}}}else if(urlConnection instanceof JarURLConnection){JarURLConnection jarURLConnection = (JarURLConnection)urlConnection;URL jarFileURL = jarURLConnection.getJarFileURL();File fileJarFile = new File(jarFileURL.toURI().getPath());JarFile jarFile = jarURLConnection.getJarFile();Enumeration<JarEntry> it = jarFile.entries();while(it.hasMoreElements()){String className = it.nextElement().getName().replace("/",".");if(className.endsWith(".class") && className.startsWith(packageName + ".")){className = className.substring(0,className.length() - 6);Class interClass = FeignJust.class.getClassLoader().loadClass(className);Url urlAno = (Url)interClass.getAnnotation(Url.class);if(urlAno!=null){Object action = FeignJust.action(interClass,urlAno.value());String classSimpleName = firstLower(interClass.getSimpleName());actionMap.put(interClass,action);}}}}} catch (IOException e) {e.printStackTrace();} catch (URISyntaxException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}private static Object serivce(Class interClass) {try {return interClass.newInstance();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}return null;}
}

4、测试接口类 IBaseAction.java

package com.suntown.interaction;import com.suntown.annotation.Url;
import feign.Headers;
import feign.RequestLine;@Url("http://localhost:8089")
public interface IBaseAction{@RequestLine("POST /login/login")@Headers({"Content-Type: application/json","Accept: application/json"})public Object login(Admin admin);public static class Admin{private String username;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}private String password;}
}

5、feign接口的调用

package com.suntown;import com.suntown.interaction.IBaseAction;public class Main{public static void main(String[] args){FeignJust.scanPackage("com.suntown.interaction");IBaseAction baseAction = FeignJust.getAction(IBaseAction.class);IBaseAction.Admin admin = new IBaseAction.Admin();admin.setUsername("admin");admin.setPassword("123");Object result = baseAction.login(admin);System.out.println("class="+result.getClass()+","+result);}
}

6、运行结果

Java中feign的独立使用相关推荐

  1. java中 数组声明,java数组声明格式

    java 声明动态数组,java对象数组详解,java中声明数组,java数组声明格式 Java 中数组的声明一维数组的声明: 在 Java 中,数组是独立的对象,有自身的方法,不是变量的集合. 数组 ...

  2. java 中括号中的语句,Java中是使用大括号括起来的语句块,用于完成一个相对独立的逻辑功能,这种语句被称作()。...

    Java中是使用大括号括起来的语句块,用于完成一个相对独立的逻辑功能,这种语句被称作(). 更多相关问题 下列哪项措施不能提高砌体受压构件的承载力()? 商业银行办理个人储蓄存款业务,应当遵循地原则( ...

  3. SpringCloud 中 Feign 核心原理,简单易懂!

    目录 SpringCloud 中 Feign 核心原理 Feign远程调用的基本流程 Feign 远程调用的重要组件 Feigh 远程调用的执行流程 SpringCloud 中 Feign 核心原理 ...

  4. SpringCloud 中Feign原理(图解)

    1 SpringCloud 中Feign原理 1.1 Feign简介 Feign是Netflix公司开源的轻量级rest客户端,使用Feign可以非常方便的实现Http 客户端.Spring Clou ...

  5. java中调用python

    在Java中调用Python </h1><div class="clear"></div><div class="postBod ...

  6. java中JVM的原理【转】

    一.java虚拟机的生命周期: Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序.程序开始执行时他才运行,程序结束时他就停止.你在同一台机器上运行三个程序,就会 ...

  7. Java中的ClassLoader和SPI机制

    深入探讨 Java 类加载器 成富是著名的Java专家,在IBM技术网站发表很多Java好文,也有著作. 线程上下文类加载器 线程上下文类加载器(context class loader)是从 JDK ...

  8. Java中常见的锁简述

    在Java的应用中,或多或少的都会接触到一些锁,那么问题就来了,在Java中,常见的锁有哪些,都有什么样的作用?? 这里给大家简单的简述一下这些学常见的锁. 本文件所涉及到的锁: 1.公平锁 / 非公 ...

  9. Java中的50个关键字

    2019独角兽企业重金招聘Python工程师标准>>> Java中的50个关键字 关键字也称为保留字,是指java语言中规定了特定含义的标示符.对于保留字,用户只能按照系统规定的方式 ...

最新文章

  1. python 参数类型的多态_【Python】面向对象:类与对象\封装\继承\多态
  2. Python如何使用不同分隔符切分字符串
  3. Angular搭建框架比较好用的插件
  4. struts2 去掉或修改后缀名
  5. PMP之项目风险管理---实施定性风险分析
  6. 为什么说Java中要慎重使用继承
  7. CentOS 关闭蜂鸣器声音
  8. 7、STC12C5A60S2核心芯片说明文档
  9. 形容谣言的四字词语_四字词语加解释大全
  10. css伪类加垂直分割线
  11. 【人工智能AI】AI写作:《怎样成为一个优秀的架构师》
  12. 说说qwerty、dvorak、colemak三种键盘布局
  13. 如何简单的爬取网络数据
  14. 计算机怎样看配置高低,笔记本电脑配置怎么看 查询配置参数高低教程
  15. 百度,互联网的“流氓大亨”?
  16. [研究方向]什么是深度学习?它到底有多火?
  17. Eric Xing:Petuum 1.1最后一次定期完全开源新版发布
  18. MATLAB教学_02基本操作与矩阵入
  19. idea 搜狗输入法无法输入中文
  20. Android客户端与本地服务器Socket通信

热门文章

  1. postman登录获取token,接口header中添加token发送请求
  2. 使用remove.bg库制作证件照生成工具
  3. 拳皇97风云再起汉化版怎么调难度呀
  4. 个人HTML期末大作业~ 个人网页(HTML+CSS)6页面带下拉特效~简单带表格带设计说明 ~学生网页设计作业源码...
  5. [MobaXterm] Unable to detect graphics environment
  6. 【vue】滚动条自动滚动到底部
  7. 进阶篇-安卓系统:3.初识安卓手机内置传感器
  8. [MOP]出轨札记【原创】(又名:断翅的蝴蝶)
  9. org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException错误
  10. 如何做好网站策划方案