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)

相关推荐

  • 夜晚的英语,晚上的单词用英语怎么说

    技术夜晚的英语,晚上的单词用英语怎么说英文:night 读法2113:英 [naɪt] 美 [naɪt] 释义:n.夜;夜晚5261;晚上夜晚的英语,夜晚(夜里就寝前的一段时间4102) 短语1653: 1、waste

    生活 2021年10月26日
  • SequoiaDB 分布式事务实现原理是什么

    技术SequoiaDB 分布式事务实现原理是什么这篇文章将为大家详细讲解有关SequoiaDB 分布式事务实现原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1分

    攻略 2021年11月23日
  • 树莓派如何连接USB摄像头

    技术树莓派如何连接USB摄像头这篇文章主要介绍树莓派如何连接USB摄像头,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、用lsusb指令查看一下是否能识别 二、查看/dev设备ls /dev查看

    攻略 2021年11月20日
  • 如何进行Java反编译插件的安装和使用

    技术如何进行Java反编译插件的安装和使用今天就跟大家聊聊有关如何进行Java反编译插件的安装和使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在开发过程中,如

    攻略 2021年11月10日
  • 我最喜欢的一本书英语作文,我最喜欢的故事书英语范文

    技术我最喜欢的一本书英语作文,我最喜欢的故事书英语范文My Favorite Book Harry Potter Do you know Harry Potter? Its one of my favorite read

    生活 2021年10月28日
  • CF1394C Boboniu and String

    技术CF1394C Boboniu and String CF1394C Boboniu and String题解
    好妙的一道题。
    将每个串都抽象成二维平面上的一个点 \((x_i,y_i)\),\(x

    礼包 2021年10月27日