返回顶部
首页 > 资讯 > 精选 >Java中怎么利用接口来创建代理
  • 508
分享到

Java中怎么利用接口来创建代理

2023-06-15 11:06:33 508人浏览 八月长安
摘要

Java中怎么利用接口来创建代理?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先创建工厂bean,就是用来返回代理的FactoryBeanimport org.

Java中怎么利用接口来创建代理?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

首先创建工厂bean,就是用来返回代理的FactoryBean

import org.springframework.beans.factory.FactoryBean;import org.springframework.beans.factory.annotation.Autowired;import java.lang.reflect.Proxy;public class HttpProxyFactoryBean<T> implements FactoryBean<T> {        @Autowired    private HttpProxyInvocationHandler httpProxyInvocationHandler;    private Class<T> rpcInterface;    public HttpProxyFactoryBean(Class<T> rpcInterface){        this.rpcInterface = rpcInterface;    }    @Override    public T getObject() throws Exception {        //这里应该放ComputerService接口        return (T)Proxy.newProxyInstance(rpcInterface.getClassLoader(),new Class[]{rpcInterface} ,httpProxyInvocationHandler);    }    @Override    public Class<?> getObjectType() {        return rpcInterface;    }}

每一个动态代理类都必须要实现InvocationHandler这个接口

每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。

我们可以直接将实现InvocationHandler的实现类注入spring容器中,然后每一个接口走同一个innvoke方法,当然也可以每一个都new一个,然后可以在构造方法中塞入特定的一些参数。我这边因为对应的每一个代理没啥特殊的就走同一个了:
定义一些参数,请求的urlproxy.serverUrl,和请求添加的项目,proxy.project

import cn.hutool.http.HttpRequest;import com.alibaba.fastJSON.jsON;import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.util.Collection;import java.util.HashMap;import java.util.Map;@Componentpublic class HttpProxyInvocationHandler implements InvocationHandler {    @Value("${proxy.serverUrl}")    private String serverUrl;    @Value("${proxy.project}")    private String serverProject;    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        Class<?> declarinGClass = method.getDeclaringClass();        if (Object.class.equals(declaringClass)) {            return method.invoke(this, args);        }        String methodName = method.getName();        String name = method.getDeclaringClass().getName();        //拼接请求地址        String url = serverUrl + name + "/" + methodName;//        String url = "http://test:8080/soa/com.rdd.TestService/createActivity";        HashMap<String, String> paramMap = new HashMap<>();    //        String result = HttpRequest.post(url).headerMap(paramMap, true).body("[" + JSONObject.toJSONString(args) + "]").execute().body();        String result = HttpRequest.post(url).headerMap(paramMap, true).body(JSONObject.toJSONString(args)).execute().body();        System.out.println(">>>" + url + "的响应结果为:" + result);        //将响应结果转换为接口方法的返回值类型        Class<?> returnType = method.getReturnType();        if (returnType.isPrimitive() || String.class.isAssignableFrom(returnType)) {            if (returnType == int.class || returnType == Integer.class) {                return Integer.valueOf(result);            } else if (returnType == long.class || returnType == Long.class) {                return Long.valueOf(result);            }            return result;        } else if (Collection.class.isAssignableFrom(returnType)) {            return JSONArray.parseArray(result, Object.class);        } else if (Map.class.isAssignableFrom(returnType)) {            return JSON.parseObject(result, Map.class);        } else {            return JSONObject.parseObject(result, returnType);        }    }}

最后后将对应的工厂bean封装成bean定义,注入到spring容器中

我们的接口一般都是jar形式的,我就简单的写在一个proxy.txt文件中,然后去读取对应的接口全路径,注入到spring容器中,当然也可以通过扫描某个包,自定义注解等等方式实现。

import cn.hutool.core.io.file.FileReader;import org.apache.commons.lang.StringUtils;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;import org.springframework.beans.factory.support.*;import org.springframework.context.annotation.PropertySource;import org.springframework.stereotype.Component;import java.util.HashSet;import java.util.List;import java.util.Set;@Component@PropertySource("classpath:application.properties")public class HttpProxyReGIStryPostProcessor implements BeanDefinitionRegistryPostProcessor {        @Override    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {        //默认UTF-8编码,可以在构造中传入第二个参数做为编码        FileReader fileReader = new FileReader("proxy.txt");        List<String> classStrList = fileReader.readLines();        Set<Class<?>> proxyClazzSet = new HashSet<>();        for (String s : classStrList) {            if (StringUtils.isBlank(s)) {                continue;            }            try {                Class<?> aClass = Class.forName(s);                proxyClazzSet.add(aClass);            } catch (ClassNotFoundException e) {                e.printStackTrace();            }        }        for (Class<?> targetClazz : proxyClazzSet) {            BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(targetClazz);            GenericBeanDefinition definition = (GenericBeanDefinition) beanDefinitionBuilder.getRawBeanDefinition();            //设置构造方法的参数  对于Class<?>,既可以设置为Class,也可以传Class的完全类名            //definition.getConstructorArgumentValues().addGenericArgumentValue(targetClazz);            definition.getConstructorArgumentValues().addGenericArgumentValue(targetClazz.getName());            //Bean的类型,指定为某个代理接口的类型            definition.setBeanClass(HttpProxyFactoryBean.class);            //表示 根据代理接口的类型来自动装配            definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);            beanDefinitionRegistry.registerBeanDefinition(targetClazz.getName(),definition);        }    }    @Override    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {    }}

关于Java中怎么利用接口来创建代理问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网精选频道了解更多相关知识。

--结束END--

本文标题: Java中怎么利用接口来创建代理

本文链接: https://lsjlt.com/news/280086.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java中怎么利用接口来创建代理
    Java中怎么利用接口来创建代理?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先创建工厂bean,就是用来返回代理的FactoryBeanimport org....
    99+
    2023-06-15
  • java怎么创建接口实现类
    这篇“java怎么创建接口实现类”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“java怎么创建接口实现类”文章吧。本教程操作...
    99+
    2023-06-30
  • 详解Java是如何通过接口来创建代理并进行http请求
    场景 现在想要做这么一个事情,公司的dubbo服务都是内网的,但是提供了一个对外的出口,通过链接就能请求到对应的dubbo服务。(具体怎么做的应该就是个网关,然后将http请求转为d...
    99+
    2024-04-02
  • SpringBoot2中怎么利用Swagger2构建接口管理界面
    本篇文章为大家展示了SpringBoot2中怎么利用Swagger2构建接口管理界面,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、Swagger2简介1、Swagger2优点整合到Spring ...
    99+
    2023-06-02
  • 怎么在java中创建一个接口实现类
    这期内容当中小编将会给大家带来有关怎么在java中创建一个接口实现类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型...
    99+
    2023-06-14
  • 怎么在java中利用default操作接口
    怎么在java中利用default操作接口?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基...
    99+
    2023-06-14
  • 如何在Java怎么中创建一个动态接口
    这篇文章将为大家详细讲解有关如何在Java怎么中创建一个动态接口,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。mybatis / jpa 等orm框架,可以在接口上加注解进行开发,不需要编写...
    99+
    2023-05-31
    java ava
  • 怎么在java中利用反射创建实例
    怎么在java中利用反射创建实例?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、Queu...
    99+
    2023-06-14
  • 怎么在java中利用反射创建对象
    今天就跟大家聊聊有关怎么在java中利用反射创建对象,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、...
    99+
    2023-06-14
  • Java 中怎么利用Runnable线程编写接口
    本篇文章为大家展示了Java 中怎么利用Runnable线程编写接口,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。将我们的线程代码写入其中,就完成了这一部分 的任务。但是Runnable接口并没有任...
    99+
    2023-06-17
  • Java中怎么利用Swagger配置扫描接口
    本篇文章为大家展示了Java中怎么利用Swagger配置扫描接口,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1. Swagger--配置扫描接口及开关1.1 配置扫描接口SwaggerConfig...
    99+
    2023-06-20
  • 在Java中怎么利用代理对网络进行连接
    在Java中怎么利用代理对网络进行连接?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。需求是这样的:一、界面上要有这样几种代理类型可以选。HTTP代理 Socks...
    99+
    2023-05-31
    java ava
  • ADO.NET中怎么创建一个通用接口对象
    本篇文章为大家展示了ADO.NET中怎么创建一个通用接口对象,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。使用ADO.NET DbProviderFactories类来创建对象。提供程序工厂模型的限...
    99+
    2023-06-17
  • JAVA中的HTTPS接口怎么利用HttpClient进行调用
    JAVA中的HTTPS接口怎么利用HttpClient进行调用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。为了避免需要证书,所以用一个类继承DefaultHttpClient...
    99+
    2023-05-31
    java httpclient https
  • java中怎么理解Callable接口
    本篇内容介绍了“java中怎么理解Callable接口”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Callable、Executor 与 ...
    99+
    2023-06-16
  • Laravel中怎么利用Provider 创建 Service
    这篇文章将为大家详细讲解有关Laravel中怎么利用Provider 创建 Service,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、定义服务类我们这...
    99+
    2024-04-02
  • 在Laravel中创建API接口出错怎么办
    这篇文章主要介绍在Laravel中创建API接口出错怎么办,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在Laravel 中创建了API 接口。 当前端发送POST请求时, 查看 n...
    99+
    2024-04-02
  • 利用ECharts和Python接口创建漏斗图的步骤
    利用ECharts和Python接口创建漏斗图的步骤,需要具体代码示例漏斗图是一种常用于展示数据流程和转化率的可视化图表。在数据分析和业务决策中,漏斗图能够清晰显示不同阶段的转化率,帮助分析人员更好地理解数据流程和优化业务流程。本文将介绍如...
    99+
    2023-12-17
    Python echarts 漏斗图
  • 利用java怎么为移动端写接口
    本篇文章为大家展示了利用java怎么为移动端写接口,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。java作为一门后端语言,其厉害之处在于web,大家比较熟知的各种网络应用,java都能做,那么在这个...
    99+
    2023-05-31
    java ava
  • Linux 中怎么利用udev创建ASM DISK
    Linux 中怎么利用udev创建ASM DISK,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、查看系统环境内核版本:[r...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作