国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

SpringBoot 動態(tài)代理|反射|注解|AOP 優(yōu)化代碼(一)-動態(tài)代理提供接口默認實現(xiàn)

mj / 2713人閱讀

摘要:生產環(huán)境由注冊中心,通過調用,其它環(huán)境直接通過直接通過調用。當然動態(tài)代理提供接口的默認實現(xiàn)只是演示,并沒有什么實際內容。下一篇動態(tài)代理反射注解優(yōu)化代碼二反射

一、背景

在項目中需要調用外部接口,由于需要調用不同環(huán)境(生產、測試、開發(fā))的相同接口(例如:向生、測試、開發(fā)環(huán)境的設備下發(fā)同一個APP)。

1.生產環(huán)境由SpringCloud注冊中心,通過Feign調用,
2.其它環(huán)境直接通過OKHttp直接通過Url調用。

因此需要根據(jù)傳入的環(huán)境調選擇不同的調用方式。

優(yōu)化前代碼結構

下面以添加和刪除設備接口為例(一切從簡,不代表真正業(yè)務代碼):

public interface DeviceHandler {

   
    void remoteAddBatch(RemoteAddDeviceParam remoteAddDeviceParam, Integer envValue);

 
    void remoteDeleteBatch(Integer envValue, List snsList);

}

Feign方式實現(xiàn):

@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方式實現(xiàn)

@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(其實類似代理),選擇具體調用哪種實現(xiàn),對上層服務暴露的是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) {
       //根據(jù)傳入的環(huán)境返回DeviceHandlerUrlImpl 或 DeviceHandlerUrlImpl
    }
}

上層服務調用 DeviceHandlerRouter 實現(xiàn)對設備的添加和刪除操作。

存在問題

如果新增一直接口調用就需要新增實現(xiàn)xxxRouter,但是代碼基本上都是一樣的。有沒有什么方式不用寫代碼而提供默認實現(xiàn)?

動態(tài)代理提供默認實現(xiàn)
@Slf4j
public class DynamicProxyBeanFactory implements InvocationHandler {

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //各位客官別急,這里只是簡單打印一下,真正的代碼在下一篇
        log.info("DynamicProxyBeanFactory------------------>invoke")
        //正兒八經(jīng)的隨便創(chuàng)建一個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(...);

參考鏈接:動態(tài)代理提供接口默認實現(xiàn)

總結

以上我們只是拋出在實際開發(fā)中面臨的問題,以及找到解決問題的第一步的方法。 當然動態(tài)代理提供接口的默認實現(xiàn)只是演示,并沒有什么實際內容。

下一篇:SpringBoot 動態(tài)代理|反射|注解|AOP 優(yōu)化代碼(二)-反射

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75296.html

相關文章

  • SpringBoot 動態(tài)代理|反射|注解|AOP 優(yōu)化代碼(二)-反射

    摘要:動態(tài)代理反射注解優(yōu)化代碼一動態(tài)代理提供接口默認實現(xiàn)我們拋出問題,并且提出解決問題的第一步的方法。重寫動態(tài)代理類,實現(xiàn)通過的查找出傳入的所有泛型的實現(xiàn)下一篇動態(tài)代理反射注解優(yōu)化代碼三注解 SpringBoot 動態(tài)代理|反射|注解|AOP 優(yōu)化代碼(一)-動態(tài)代理提供接口默認實現(xiàn) 我們拋出問題,并且提出解決問題的第一步的方法。下面我們繼續(xù)深入,動態(tài)代理和反射繼續(xù)解決我們的問題。 改動代...

    spacewander 評論0 收藏0
  • SpringBoot 動態(tài)代理|反射|注解|AOP 優(yōu)化代碼(三)-注解

    摘要:上一篇動態(tài)代理反射注解優(yōu)化代碼二反射我們實現(xiàn)了通過反射完善找到目標類,然后通過動態(tài)代理提供默認實現(xiàn),本篇我們將使用自定義注解來繼續(xù)優(yōu)化。下一篇動態(tài)代理反射注解四動態(tài)代理對象注入到容器 上一篇SpringBoot 動態(tài)代理|反射|注解|AOP 優(yōu)化代碼(二)-反射 我們實現(xiàn)了通過反射完善找到目標類,然后通過動態(tài)代理提供默認實現(xiàn),本篇我們將使用自定義注解來繼續(xù)優(yōu)化。 創(chuàng)建注解 1.創(chuàng)建枚舉...

    Charles 評論0 收藏0
  • SpringBoot 動態(tài)代理|反射|注解(四)- 動態(tài)代理對象注入到Spring容器

    摘要:上一篇動態(tài)代理反射注解優(yōu)化代碼三注解本篇我們將實現(xiàn)通過代理生成的對象注入到容器中。單元測試優(yōu)化代碼待續(xù)參考文章 上一篇:SpringBoot 動態(tài)代理|反射|注解|AOP 優(yōu)化代碼(三)-注解 本篇我們將實現(xiàn)通過代理生成的對象注入到spring容器中。首先需要實現(xiàn)BeanDefinitionRegistryPostProcessor, ApplicationContextAware兩個...

    lingdududu 評論0 收藏0
  • Aop?看這篇文章就夠了!!!

    摘要:又是什么其實就是一種實現(xiàn)動態(tài)代理的技術,利用了開源包,先將代理對象類的文件加載進來,之后通過修改其字節(jié)碼并且生成子類。 在實際研發(fā)中,Spring是我們經(jīng)常會使用的框架,畢竟它們太火了,也因此Spring相關的知識點也是面試必問點,今天我們就大話Aop。特地在周末推文,因為該篇文章閱讀起來還是比較輕松詼諧的,當然了,更主要的是周末的我也在充電學習,希望有追求的朋友們也盡量不要放過周末時...

    boredream 評論0 收藏0
  • 動態(tài)代理到SpringAop以及AspectJ風格

    摘要:具體的動態(tài)代理運行原理這里暫不展開,網(wǎng)上有很多相關的內容,比如這篇翻譯過來就是面向方面切面編程。所以切面可以理解為和的集合。 1.靜態(tài)代理 在提及動態(tài)代理前先說明一下靜態(tài)代理模式,靜態(tài)代理模式是一種很常見的通用設計模式,實現(xiàn)也很簡單,uml類圖如下: showImg(https://segmentfault.com/img/bVba3gn?w=737&h=312); 如上圖所示,代理類...

    msup 評論0 收藏0

發(fā)表評論

0條評論

mj

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<