亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

mj / 2790人閱讀

摘要:生產(chǎn)環(huán)境由注冊(cè)中心,通過(guò)調(diào)用,其它環(huán)境直接通過(guò)直接通過(guò)調(diào)用。當(dāng)然動(dòng)態(tài)代理提供接口的默認(rèn)實(shí)現(xiàn)只是演示,并沒(méi)有什么實(shí)際內(nèi)容。下一篇?jiǎng)討B(tài)代理反射注解優(yōu)化代碼二反射

一、背景

在項(xiàng)目中需要調(diào)用外部接口,由于需要調(diào)用不同環(huán)境(生產(chǎn)、測(cè)試、開(kāi)發(fā))的相同接口(例如:向生、測(cè)試、開(kāi)發(fā)環(huán)境的設(shè)備下發(fā)同一個(gè)APP)。

1.生產(chǎn)環(huán)境由SpringCloud注冊(cè)中心,通過(guò)Feign調(diào)用,
2.其它環(huán)境直接通過(guò)OKHttp直接通過(guò)Url調(diào)用。

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

優(yōu)化前代碼結(jié)構(gòu)

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

public interface DeviceHandler {

   
    void remoteAddBatch(RemoteAddDeviceParam remoteAddDeviceParam, Integer envValue);

 
    void remoteDeleteBatch(Integer envValue, List snsList);

}

Feign方式實(shí)現(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方式實(shí)現(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(其實(shí)類似代理),選擇具體調(diào)用哪種實(shí)現(xiàn),對(duì)上層服務(wù)暴露的是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
    }
}

上層服務(wù)調(diào)用 DeviceHandlerRouter 實(shí)現(xiàn)對(duì)設(shè)備的添加和刪除操作。

存在問(wèn)題

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

動(dòng)態(tài)代理提供默認(rèn)實(shí)現(xiàn)
@Slf4j
public class DynamicProxyBeanFactory implements InvocationHandler {

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

調(diào)用:
DeviceHandler deviceHandler = DynamicProxyBeanFactory.newMapperProxy(DeviceHandler.class);
deviceHandler.remoteAddBatch(...);

參考鏈接:動(dòng)態(tài)代理提供接口默認(rèn)實(shí)現(xiàn)

總結(jié)

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

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/75296.html

相關(guān)文章

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

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

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

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

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

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

    lingdududu 評(píng)論0 收藏0
  • 學(xué)Aop?看這篇文章就夠了!??!

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

    boredream 評(píng)論0 收藏0
  • 動(dòng)態(tài)代理到SpringAop以及AspectJ風(fēng)格

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

    msup 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

mj

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<