spring boot动态生成接口怎么实现

技术spring boot动态生成接口怎么实现本篇内容主要讲解“spring boot动态生成接口怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“spring boot

本篇内容主要讲解"跳羚动态生成接口怎么实现",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"跳羚动态生成接口怎么实现"吧!

在某些业务场景中,我们只需要业务代码中定义相应的接口或者相应的注解,并不需要实现对应的逻辑。

比如框架和feign:在框架中,我们只需要定义对应的制图人接口;在假装中,我们只需要定义对应业务系统中的接口即可。

那么在这种场景下,具体的业务逻辑时怎么执行的呢,其实原理都是动态代理。

我们这里不具体介绍动态代理,主要看一下它在跳羚项目中的实际应用,下面我们模仿假装来实现一个调用三方接口的httpclient。

一: 定义注解

套餐。mysgk。博客演示。注释;

public@interfaceMyHttpClient{

}

二: 建立动态代理类

套餐com。mysgk。博客演示。代理人;

导入组织。弹簧框架。豆子。工厂。工厂豆;

导入Java。朗。反思。invocationhandler

导入Java。朗。反思。方法;

导入Java。朗。反思。代理人;

公共类ribbonaoproxyfactorytimpactsfactrybeant,InvocationHandler{

privateClassTinterfaceClass

public classtgetinterface类(){ 0

返回接口类

}

public votinsetinterfacecolass(类tinterfacecolass){ 0

这个。接口类=接口类;

}

@覆盖

publicTgetObject()throwsException {

返回代理。新的代理实例(这。getclass().getClassLoader()、newClass[]{interfaceClass}、this);

}

@覆盖

publicClass?getObjectType(){ 0

返回接口类

}

@覆盖

public booleanisingleton(){ 0

返回真

}

/**

真正执行的方法

*/

@覆盖

publicObjectinvoke(对象代理、方法方法、对象[]参数)throwsThrowable {

返回“调用”代理。GetClass().getName()' .method.getName()',doanything.

}

}

三: 注入spring容器

套餐com。mysgk。博客演示。开始;

进口cn。胡图尔。核心。乌提尔。classutil

进口cn。胡工具。核心。乌提尔。StrateIL

导入com。mysgk。布洛德莫。注释。myhttpclient

导入com。mysgk。布洛德莫。代理人。ribbonaoproxyfactory

导入组织。slf4j。伐木工人;

进口

bsp;org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import java.util.Set;
@Component
public class ScanHttpClients implements BeanDefinitionRegistryPostProcessor, ApplicationContextAware {
private final Logger logger = LoggerFactory.getLogger(ScanHttpClients.class);
private ApplicationContext ctx;
public void run(BeanDefinitionRegistry registry) {
Set<Class<?>> scanPackage = ClassUtil.scanPackageByAnnotation("com.mysgk", MyHttpClient.class);
for (Class<?> cls : scanPackage) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(cls);
GenericBeanDefinition definition = (GenericBeanDefinition) builder.getRawBeanDefinition();
definition.getPropertyValues().add("interfaceClass", definition.getBeanClassName());
definition.setBeanClass(RibbonAopProxyFactory.class);
definition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_TYPE);
String beanName = StrUtil.removePreAndLowerFirst(cls.getSimpleName(), 0) + "RibbonClient";
registry.registerBeanDefinition(beanName, definition);
}
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
run(registry);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.ctx = ctx;
}
}

四: 编写拦截器

package com.mysgk.blogdemo.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
@Component
@Aspect
public class InterceptAnnotation {
	@Autowired
	private RestTemplate ribbonLoadBalanced;
	@Pointcut("@annotation(com.mysgk.blogdemo.annotation.MyHttpClient)")
	public void execute() {
	}
	@Around("execute()")
	public Object interceptAnnotation(ProceedingJoinPoint joinPoint) throws Throwable {
		/**
		 * 此处省略 获取 url, httpMethod, requestEntity, responseType 等参数的处理过程
		 */
		ResponseEntity<?> exchange = ribbonLoadBalanced.exchange("url", HttpMethod.GET, HttpEntity.EMPTY, Object.class);
		return exchange.getBody();
	}
}

五: 新建测试类

package com.mysgk.blogdemo.client;
import com.mysgk.blogdemo.annotation.MyHttpClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@MyHttpClient
public interface MyHttpClientTest {
	@PostMapping(value = "test/t1")
	Object test(String param);
}

项目结构:

spring boot动态生成接口怎么实现

到此,相信大家对“spring boot动态生成接口怎么实现”有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/124795.html

(0)

相关推荐

  • Unity3d的基础是什么

    技术Unity3d的基础是什么今天就跟大家聊聊有关Unity3d的基础是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、Unity中的坐标系是使用的左手坐标

    攻略 2021年11月11日
  • 如何解决Python3.6中PyKeyboard插件无法输入中文字符的问题

    技术如何解决Python3.6中PyKeyboard插件无法输入中文字符的问题本篇文章为大家展示了如何解决Python3.6中PyKeyboard插件无法输入中文字符的问题,内容简明扼要并且容易理解,绝对能使你眼前一亮,

    攻略 2021年12月4日
  • 关于ccoosCreator里的物理系统

    技术关于ccoosCreator里的物理系统 关于ccoosCreator里的物理系统按理说,可以说有两个碰撞系统的
    一个是设置collision碰撞组件进行碰撞
    另一个是 设置物理引擎 getPhys

    礼包 2021年11月9日
  • 怎么用OBS和WebSockets播放视频流

    技术怎么用OBS和WebSockets播放视频流这篇文章主要为大家展示了“怎么用OBS和WebSockets播放视频流”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么用OB

    攻略 2021年10月26日
  • 高级语言程序设计实验4-2

    技术高级语言程序设计实验4-2 高级语言程序设计实验4-2题目描述有 12 人围坐成一圈玩报数游戏,从1号人员开始顺时针报数,报到k的人员被淘汰出局;接着仍沿顺时针方向从被淘汰出局者的下一人员又重新从

    礼包 2021年11月27日
  • 视频服务器为什么推荐美国服务器

    技术视频服务器为什么推荐美国服务器美国视频服务器主要是指用于部署视频直播或者点播的流媒体SDK服务器。美国视频服务器一般采用独享的物理服务器。虚拟机不同,用户可以自行管理所有硬件资源,直接控制服务器的负载,不受于其他用户

    礼包 2021年11月1日