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)

相关推荐

  • mysql修改表中的数据类型(mysql如何更改表的字段类型)

    技术mysql如何修改表的类型这篇文章主要介绍“mysql如何修改表的类型”,在日常操作中,相信很多人在mysql如何修改表的类型问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql如

    攻略 2021年12月13日
  • 抖音赞在哪买,哪里抖音刷赞最安全?

    技术抖音赞在哪买,哪里抖音刷赞最安全?抖音应该是最近比较火的软件了,对此,大家都不陌生吧,很多的用户发个视频就好几十万的赞,其实都是可以刷的!要想上精选有必要要有播放量等等一系列数据,这个数据很的重要,没有数据就没有展现

    测评 2021年10月20日
  • 香港站群服务器选择如何影响 SEO 过程

    技术香港站群服务器选择如何影响 SEO 过程选择合适的服务器无疑会对网站在搜索结果中的位置产生影响。正如上面提到的,选择的托管服务决定了服务器响应时间,进而影响页面加载速度。您可能知道后一个是Google排名因素,因此,

    礼包 2021年12月23日
  • 羊绒衫怎么洗最好,羊绒衫染了用什么方法可以洗掉

    技术羊绒衫怎么洗最好,羊绒衫染了用什么方法可以洗掉清洗羊绒衫前羊绒衫怎么洗最好,先注意羊绒衫的衣标,尤其是衣服的成分,清洗方式,水温及晾干方法,不要因为操作失误,浪费一件衣服。 将洗衣盆内接好清水,水温控制在35度以下,

    生活 2021年10月28日
  • logback的使用和logback.xml详解

    技术logback的使用和logback.xml详解 logback的使用和logback.xml详解转载:https://blog.csdn.net/lhl1124281072/article/det

    礼包 2021年10月20日
  • openwrt怎样装进u盘好(openwrt扩展系统到u盘)

    技术OpenWRT如何挂接U盘这篇文章将为大家详细讲解有关OpenWRT如何挂接U盘,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 DIR-505 有一个 USB2.0 接口,给

    攻略 2021年12月18日