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)

相关推荐

  • TensorRT——INT8推理

    技术TensorRT——INT8推理 TensorRT——INT8推理原理为什么要使用INT8推理:更高的吞吐量/处理的fps提高以及更低的内存占用(8-bit vs 32-bit)
    将FP32模型转换

    礼包 2021年11月12日
  • 抖音刷赞软件-在线刷抖音播放量

    技术抖音刷赞软件-在线刷抖音播放量抖音刷赞软件-在线刷抖音播放量
    行骗者猖獗之外,问题的背面,亦存在“热门造假”的公开秘密。同被套路的大四学生侯明明的心态具备一定代表性,她直言自己放松警惕心的原因:“现在好多热门都是刷的

    测评 2021年11月13日
  • 便扶向路,《桃花源记》这首诗全文的注音

    技术便扶向路,《桃花源记》这首诗全文的注音táo huā yuán jì jìn ·táo qián 《桃花源记》 晋·陶潜
    jìn tài yuán z

    生活 2021年10月28日
  • C++ 声明、定义、初始化、赋值

    技术C++ 声明、定义、初始化、赋值 C++ 声明、定义、初始化、赋值声明:只是规定了变量的类型和名字,而没有进行内存分配。
    定义:不仅规定了变量的类型和名字,而且进行了内存分配,也可能会对量进行初始化

    礼包 2021年12月6日
  • 关于keyframes的用法

    技术关于keyframes的用法 关于keyframes的用法CSS3的@keyframes用法详解:@keyframes与animation属性是密切相关的
    一.基本知识:keyframes翻译成中文

    礼包 2021年12月5日
  • 提问的英文,对于价格的提问,用英语怎么说

    技术提问的英文,对于价格的提问,用英语怎么说对于价格的提问的英文:How muchmuch 读法 英 [mʌtʃ] 美 [mʌtʃ] 1、det./pron.(与不可数名词连用,尤用于否定句;或与how连用以询问数

    生活 2021年10月26日