本篇内容主要讲解"跳羚动态生成接口怎么实现",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"跳羚动态生成接口怎么实现"吧!
在某些业务场景中,我们只需要业务代码中定义相应的接口或者相应的注解,并不需要实现对应的逻辑。
比如框架和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动态生成接口怎么实现”有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/124795.html