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)

相关推荐

  • 怎么在LibreOffice中完全启用深色模式

    技术怎么在LibreOffice中完全启用深色模式小编给大家分享一下怎么在LibreOffice中完全启用深色模式,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们

    攻略 2021年10月26日
  • [Lua语言基础]-2、变量、变量的类型、注释

    技术[Lua语言基础]-2、变量、变量的类型、注释 [Lua语言基础]-2、变量、变量的类型、注释变量:
    变量不需要在使用前声明,且不需要指定变量的类型(string,number等)变量都是弱类型,J

    礼包 2021年11月14日
  • Eureka属性配置

    技术Eureka属性配置 Eureka属性配置一:Eureka Instance实例信息配置 里面的配置以"-"隔开 其实也支持驼峰命名代替"-"首先是入门时的配置:
    server: port: 80

    礼包 2021年10月28日
  • 坐便器品牌排行,孕妇坐便器的品牌有哪些呢

    技术坐便器品牌排行,孕妇坐便器的品牌有哪些呢1坐便器品牌排行、TOTO(东陶旗下,于1917年日本,十大座便器品牌,厨卫百强企业,东陶(中国)有限公司)2、箭牌-法恩莎(乐华陶瓷旗下,中国名牌,一线牌子,坐便器十大品牌,

    生活 2021年10月23日
  • 描写梨花的优美古诗,几句赞美梨花的优美语句

    技术描写梨花的优美古诗,几句赞美梨花的优美语句1、清晨,白璧无瑕,大地从沉睡中清醒,梨花也充满着蓬勃的朝气描写梨花的优美古诗。梨花没有玫瑰的妖娆美丽,没有菊花的傲然脱俗,然而它却是我最喜爱的花,雪白的花瓣在露珠的清洗下变

    生活 2021年10月29日
  • ad pads allegro哪个好学(halcyon ad blocker)

    技术如何进行GoAead RCE预警分析如何进行GoAead RCE预警分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。0x00 背景介绍12月12日,M

    攻略 2021年12月20日