成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

spacewander / 992人閱讀

摘要:動態(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ù)解決我們的問題。

改動代碼結構

新增一個HandlerRougter接口,其目的就是替代上一篇的DeviceHandlerRouter

public interface HandlerRouter {
    T getHandler(Integer env,Object... args);
}

其中T是具體的業(yè)務接口。下面實現(xiàn)DeviceHandler的HandlerRouter:

public interface DeviceHandlerRouter extends HandlerRouter {
}

那么上層代碼的調用方式將會類似下面的代碼:

DeviceHandlerRouter deviceHandlerRouter = ...
deviceHandlerRouter.getHandler(...). remoteAddBatch(...)
反射+動態(tài)代理

前面說過,每增加一種接口調用,就需要重新實現(xiàn)xxxHandlerRouter,那么下面我們通過動態(tài)代理和反射提供DeviceHandler的默認實現(xiàn)。

1.通過反射獲取HandlerRouter的子接口和泛型對應的類

首先加入下面的依賴

        
            org.reflections
            reflections
            0.9.10
        
/**
 * 通過反射掃描出所有HandlerRouter的子類
 * @return
 */
private Set> getHandlerRouterClasses() {
        Reflections reflections = new Reflections(
                "package.name.*",
                new TypeAnnotationsScanner(),//注解掃描,本節(jié)用不到
                new SubTypesScanner()
        );
        return reflections.getSubTypesOf(HandlerRouter.class);
}
Set> classes = getHandlerRouterClasses();
//獲取HandlerRouter的子接口的泛型Class 例如:DeviceHandlerRouter接口的DeviceHandler
for (Class clazz : classes) {
    //clazz 對應DeviceHandlerRouter.class
    Type[] types = clazz.getGenericInterfaces();
    ParameterizedType type = (ParameterizedType) types[0];
    
    //typeName對應DeviceHandlerRouter extends HandlerRouter 中的DeviceHandler.class
    String typeName = type.getActualTypeArguments()[0].getTypeName();
}

2.SpringBoot ApplicationContext 獲取注入的bean

修改上一篇中實現(xiàn)的動態(tài)代理類,我們想要實現(xiàn):“能夠根據(jù)傳入的泛型的Class 獲取到Spring容器中該類型的所有bean”,因此我們就需要傳入ApplicationContext。那就需要實現(xiàn)ApplicationContextAware接口,下面的代碼來自網(wǎng)絡。

@Component
public class SpringUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringUtil.applicationContext = applicationContext;
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }


    /**
     * 通過class獲取所有該類型的bean
     * @param clazz
     * @return
     */
    public static Map getBeans(Class clazz) {
        return getApplicationContext().getBeansOfType(clazz);
    }
}

3.重新實現(xiàn)動態(tài)代理類

@Slf4j
public class DynamicProxyBeanFactory implements InvocationHandler {
    private String className;
    
    public DynamicProxyBeanFactory(String className) {
        this.className = className;
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //獲取實現(xiàn)className類的所有bean
        Map classMap =SpringUtil.getBeans(Class.forName(className));
        log.info("DynamicProxyBeanFactory className:{} impl class:{}",className,classMap);
        //這里先隨便返回一個
        return classMap.get("deviceHandlerUrlImpl");
    }


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

調用:

Set> classes = getHandlerRouterClasses();
//獲取HandlerRouter的子接口的泛型Class 例如:DeviceHandlerRouter接口的DeviceHandler
for (Class clazz : classes) {
    //clazz 對應DeviceHandlerRouter.class
    //clazz 對應DeviceHandlerRouter.class
    //clazz 對應DeviceHandlerRouter.class
    
    Type[] types = clazz.getGenericInterfaces();
    ParameterizedType type = (ParameterizedType) types[0];
    
    //typeName對應DeviceHandlerRouter extends HandlerRouter 中的DeviceHandler.class
    //typeName對應DeviceHandlerRouter extends HandlerRouter 中的DeviceHandler.class
    //typeName對應DeviceHandlerRouter extends HandlerRouter 中的DeviceHandler.class
    
    String typeName = type.getActualTypeArguments()[0].getTypeName();
    
    
    DeviceHandler deviceHandler = DynamicProxyBeanFactory.newMapperProxy(typeName,clazz);
}

總結:這篇文章我們
1.通過反射獲取了HandlerRouter的所有子接口(這里是DeviceHandlerRouter),以及子接口對應的泛型。
2.重寫動態(tài)代理類,實現(xiàn)通過Spring的ApplicationContext查找出傳入的所有泛型的實現(xiàn)bean

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

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

轉載請注明本文地址:http://systransis.cn/yun/75288.html

相關文章

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

    摘要:生產(chǎn)環(huán)境由注冊中心,通過調用,其它環(huán)境直接通過直接通過調用。當然動態(tài)代理提供接口的默認實現(xiàn)只是演示,并沒有什么實際內容。下一篇動態(tài)代理反射注解優(yōu)化代碼二反射 一、背景 在項目中需要調用外部接口,由于需要調用不同環(huán)境(生產(chǎn)、測試、開發(fā))的相同接口(例如:向生、測試、開發(fā)環(huán)境的設備下發(fā)同一個APP)。 1.生產(chǎn)環(huán)境由SpringCloud注冊中心,通過Feign調用, 2.其它環(huán)境直接通過...

    mj 評論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,連動態(tài)代理的原理都不懂?

    摘要:總結動態(tài)代理的相關原理已經(jīng)講解完畢,接下來讓我們回答以下幾個思考題。 【干貨點】 此處是【好好面試】系列文的第12篇文章。文章目標主要是通過原理剖析的方式解答Aop動態(tài)代理的面試熱點問題,通過一步步提出問題和了解原理的方式,我們可以記得更深更牢,進而解決被面試官卡住喉嚨的情況。問題如下 SpringBoot默認代理類型是什么 為什么不用靜態(tài)代理 JDK動態(tài)代理原理 CGLIB動態(tài)代理...

    Keven 評論0 收藏0

發(fā)表評論

0條評論

spacewander

|高級講師

TA的文章

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