资讯专栏INFORMATION COLUMN

SpringBoot 动态代理|反射|注解|AOP 优化代码(一)-动态代理提供接口默认实现

mj / 2537人阅读

摘要:生产环境由注册中心,通过调用,其它环境直接通过直接通过调用。当然动态代理提供接口的默认实现只是演示,并没有什么实际内容。下一篇动态代理反射注解优化代码二反射

一、背景

在项目中需要调用外部接口,由于需要调用不同环境(生产、测试、开发)的相同接口(例如:向生、测试、开发环境的设备下发同一个APP)。

1.生产环境由SpringCloud注册中心,通过Feign调用,
2.其它环境直接通过OKHttp直接通过Url调用。

因此需要根据传入的环境调选择不同的调用方式。

优化前代码结构

下面以添加和删除设备接口为例(一切从简,不代表真正业务代码):

public interface DeviceHandler {

   
    void remoteAddBatch(RemoteAddDeviceParam remoteAddDeviceParam, Integer envValue);

 
    void remoteDeleteBatch(Integer envValue, List snsList);

}

Feign方式实现:

@Component
@Slf4j
public class DeviceHandlerFeignImpl implements DeviceHandler {

    @Autowired
    private DeviceFeignClient deviceFeignClient;

    @Override
    public void remoteAddBatch(RemoteAddDeviceParam remoteAddDeviceParam, Integer envValue) {
        RestResult restResult = deviceFeignClient.create(remoteAddDeviceParam);
        ...
    }

    @Override
    public void remoteDeleteBatch(Integer envValue, List snsList) {   
        RestResult restResult = deviceFeignClient.deleteBySnList(snsList);      
        ... 
    }   
  
}

Url方式实现

@Component
@Slf4j
public class DeviceHandlerUrlImpl implements DeviceHandler {

    @Override
    public void remoteAddBatch(RemoteAddDeviceParam remoteAddDeviceParam, Integer envValue) {
        String url = getAddUrlByEnvValue(envValue);
        String response = OkHttpUtils.httpPostSyn(url, JSON.toJSONString(snsList), false);
        RestResult restResult = JSON.parseObject(response, RestResult.class);
        ...
    }

    @Override
    public void remoteDeleteBatch(Integer envValue, List snsList) {
        String url = getDelUrlByEnvValue(envValue);
        String response = OkHttpUtils.httpPostSyn(url, JSON.toJSONString(snsList), false);
        RestResult restResult = JSON.parseObject(response, RestResult.class);
        ...
    }
}

起到路由作用的DeviceHandlerRouter(其实类似代理),选择具体调用哪种实现,对上层服务暴露的是DeviceHandlerRouter。

@Component
public class DeviceHandlerRouter implements DeviceHandler {
    ...

    @Autowired
    private DeviceHandlerUrlImpl deviceHandlerUrlImpl;

    @Autowired
    private DeviceHandlerUrlImpl deviceHandlerUrlImpl;


    @Override
    public void remoteAddBatch(RemoteAddDeviceParam remoteAddDeviceParam, Integer envValue) {
        getDeviceHandler(envValue).remoteAddBatch(remoteAddDeviceParam,envValue);
    }

    @Override
    public void remoteDeleteBatch(Integer envValue, List snsList) {
        getDeviceHandler(envValue).remoteDeleteBatch(envValue,snsList);
    }

    private DeviceHandler getDeviceHandler(Integer envValue) {
       //根据传入的环境返回DeviceHandlerUrlImpl 或 DeviceHandlerUrlImpl
    }
}

上层服务调用 DeviceHandlerRouter 实现对设备的添加和删除操作。

存在问题

如果新增一直接口调用就需要新增实现xxxRouter,但是代码基本上都是一样的。有没有什么方式不用写代码而提供默认实现?

动态代理提供默认实现
@Slf4j
public class DynamicProxyBeanFactory implements InvocationHandler {

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //各位客官别急,这里只是简单打印一下,真正的代码在下一篇
        log.info("DynamicProxyBeanFactory------------------>invoke")
        //正儿八经的随便创建一个DeviceHandlerUrlImpl
        return new DeviceHandlerUrlImpl();
    }


    public static  T newMapperProxy(Class mapperInterface) {
        ClassLoader classLoader = mapperInterface.getClassLoader();
        Class[] interfaces = new Class[]{mapperInterface};
        DynamicProxyBeanFactory proxy = new DynamicProxyBeanFactory();
        return (T) Proxy.newProxyInstance(classLoader, interfaces, proxy);
    }
}

调用:
DeviceHandler deviceHandler = DynamicProxyBeanFactory.newMapperProxy(DeviceHandler.class);
deviceHandler.remoteAddBatch(...);

参考链接:动态代理提供接口默认实现

总结

以上我们只是抛出在实际开发中面临的问题,以及找到解决问题的第一步的方法。 当然动态代理提供接口的默认实现只是演示,并没有什么实际内容。

下一篇:SpringBoot 动态代理|反射|注解|AOP 优化代码(二)-反射

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75296.html

相关文章

  • SpringBoot 动态代理|反射|注解|AOP 优化代码(二)-反射

    摘要:动态代理反射注解优化代码一动态代理提供接口默认实现我们抛出问题,并且提出解决问题的第一步的方法。重写动态代理类,实现通过的查找出传入的所有泛型的实现下一篇动态代理反射注解优化代码三注解 SpringBoot 动态代理|反射|注解|AOP 优化代码(一)-动态代理提供接口默认实现 我们抛出问题,并且提出解决问题的第一步的方法。下面我们继续深入,动态代理和反射继续解决我们的问题。 改动代...

    spacewander 评论0 收藏0
  • SpringBoot 动态代理|反射|注解|AOP 优化代码(三)-注解

    摘要:上一篇动态代理反射注解优化代码二反射我们实现了通过反射完善找到目标类,然后通过动态代理提供默认实现,本篇我们将使用自定义注解来继续优化。下一篇动态代理反射注解四动态代理对象注入到容器 上一篇SpringBoot 动态代理|反射|注解|AOP 优化代码(二)-反射 我们实现了通过反射完善找到目标类,然后通过动态代理提供默认实现,本篇我们将使用自定义注解来继续优化。 创建注解 1.创建枚举...

    Charles 评论0 收藏0
  • SpringBoot 动态代理|反射|注解(四)- 动态代理对象注入到Spring容器

    摘要:上一篇动态代理反射注解优化代码三注解本篇我们将实现通过代理生成的对象注入到容器中。单元测试优化代码待续参考文章 上一篇:SpringBoot 动态代理|反射|注解|AOP 优化代码(三)-注解 本篇我们将实现通过代理生成的对象注入到spring容器中。首先需要实现BeanDefinitionRegistryPostProcessor, ApplicationContextAware两个...

    lingdududu 评论0 收藏0
  • Aop?看这篇文章就够了!!!

    摘要:又是什么其实就是一种实现动态代理的技术,利用了开源包,先将代理对象类的文件加载进来,之后通过修改其字节码并且生成子类。 在实际研发中,Spring是我们经常会使用的框架,毕竟它们太火了,也因此Spring相关的知识点也是面试必问点,今天我们就大话Aop。特地在周末推文,因为该篇文章阅读起来还是比较轻松诙谐的,当然了,更主要的是周末的我也在充电学习,希望有追求的朋友们也尽量不要放过周末时...

    boredream 评论0 收藏0
  • 动态代理到SpringAop以及AspectJ风格

    摘要:具体的动态代理运行原理这里暂不展开,网上有很多相关的内容,比如这篇翻译过来就是面向方面切面编程。所以切面可以理解为和的集合。 1.静态代理 在提及动态代理前先说明一下静态代理模式,静态代理模式是一种很常见的通用设计模式,实现也很简单,uml类图如下: showImg(https://segmentfault.com/img/bVba3gn?w=737&h=312); 如上图所示,代理类...

    msup 评论0 收藏0

发表评论

0条评论

mj

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<