動的プロキシ経由の簡単なインターセプタのJava実装

まず、エージェント

私たちインターセプターどのようなJavaエージェントで簡単に外観を動的プロキシの実装を使用する前に。

エージェントは、定義により、直接へのプロキシオブジェクトを介してターゲット・オブジェクトを使用して代理店(両方のコールでターゲット・オブジェクトの下に、それは快適な音)オブジェクトが、間接的な方法を動作していません。二つのモードに分けられる作用、一方が帯電防止剤、および動的プロキシです。最初は、帯電防止剤の例を書き込みます。

それは、静的または動的プロキシエージェントであるかどうか、対象物(ターゲット)は、あなたが提供するCGLIBプロキシを使用する場合は、インターフェイスを実装する必要はありませんが、方法を議論しませサブクラスによって達成すること、ノートをインタフェース(インタフェース)を実装する必要があります。

(1)インターフェースを定義します

public interface IUserDao {
    void save();
}

(2)定義された視聴者(ターゲット)

public class UserDaoImpl implements IUserDao {
    public void save() {
        System.out.println("--------已经保存数据---------");
    }
}

(3)プロキシオブジェクトの定義

public class UserDaoProxy implements IUserDao {
    private IUserDao target;//将目标对象放到代理对象中
    public UserDaoProxy(IUserDao target){
        this.target = target;
        }
    public void save() {
        System.out.println("------开始事务------");
            target.save();
        System.out.println("-------提交事务------");
    }
}

テスト:

public class Test {
public static void main(String[] args){
    IUserDao userDao = new UserDaoImpl();
    UserDaoProxy proxy = new UserDaoProxy(userDao);
    proxy.save();//通过代理对象调用save方法
    }
}

出力は次のようになります。

------开始事务------
--------已经保存数据---------

-------提交事务------

このアプローチは、同じインターフェイスを実装する必要があり、プロキシオブジェクトが深刻なカップルであるプロキシオブジェクトを、実装されているという問題があります。したがって、改良された方法で使用し、以下、すなわち、動的プロキシ(プロキシJDK)。

動的プロキシアプローチはまた、対象物(ターゲット)インタフェースを実装する必要

(1)インタフェースを定義する(IUserDao)

(2)ターゲット・オブジェクト・クラスを定義する(UserDaoImpl)

(3)動的プロキシクラスを作成します

public class ProxyFactory {
    //维护一个目标对象
    private Object target;
 
    public ProxyFactory(Object target) {
        this.target = target;
    }
 
    //给目标对象生成代理对象
    public Object getProxyInstance() {
        System.out.println("----target class---" + target.getClass());
        System.out.println("----target interfaces---" +
            target.getClass().getInterfaces());
 
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
            target.getClass().getInterfaces(),
            new InvocationHandler() {
                public Object invoke(Object proxy, Method method, Object[] args)
                    throws Throwable {
                    System.out.println("----开始事务2-----");
 
                    //执行目标对象方法
                    Object returnValue = method.invoke(target, args);
                    System.out.println("----提交事务2----");
 
                    return returnValue;
                }
            });
    }
}

テスト:

public class Test {
    public static void main(String[] args) {
        //目标对象
        IUserDao target = new UserDaoImpl();
        System.out.println(target.getClass());
 
        //给目标对象创建代理对象
        IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
        System.out.println("----proxy----:" + proxy.getClass());
        proxy.save();
        proxy.delete();
    }
}

出力:

class com.jd.pattern.proxy.dynamicProxy.UserDao
----target class---class com.jd.pattern.proxy.dynamicProxy.UserDao
----target interfaces---[Ljava.lang.Class;@1fb3ebeb
----proxy----:class com.sun.proxy.$Proxy0
----开始事务2-----
-----保存完成------
----提交事务2----
----开始事务2-----
----删除完成----

----提交事务2----

第二に、簡単なインターセプタを実装するための動的プロキシの使用

それは動的プロキシ方法であるため、その後確かインターセプターと共にインターフェース、ターゲットクラス、プロキシクラスが存在するであろう

図1に示すように、インターフェースを定義します

public interface BusinessFacade {
    void doSomething();
}

図2に示すように、ターゲット・オブジェクトの定義

public class BusinessClass implements BusinessFacade {
    public void doSomething() {
        System.out.println("在业务组件BusinessClass中调用doSomething方法");
    }
}

インターセプタを作成します3。

public class InterceptorClass {
    public void before() {
        System.out.println("在InterceptorClass中调用方法:before()");
    }
 
    public void after() {
        System.out.println("在InterceptorClass中调用方法:after()");
    }
}

4、プロキシを作成

public class DynamicProxyHandler {
    //声明被代理对象
    private Object target;
    //创建拦截器
    InterceptorClass interceptor = new InterceptorClass();
    //动态生成一个代理对象,并绑定被代理类和代理处理器
    public Object getProxyInstance(final Object target) {
        this.target = target;
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
            target.getClass().getInterfaces(),
            new InvocationHandler() {
                public Object invoke(Object proxy, Method method, Object[] args)
                    throws Throwable {
                    interceptor.before();
                    Object result = method.invoke(target, args);
                    interceptor.after();
                    return result;
                }
            });
    }
}

テスト:

public class Test {
    public static void main(String[] args) {
        //创建动态代理工具
        DynamicProxyHandler proxyHandler = new DynamicProxyHandler();
        //创建业务组件
        BusinessFacade target = new BusinessClass();
        //获取代理对象
        BusinessFacade proxy = (BusinessFacade) proxyHandler.getProxyInstance(target);
        //通过代理对象调用目标对象方法
        proxy.doSomething();
    }
}

出力:

コールInterceptorClass方法:前()は、
ビジネスコンポーネントBusinessClassのでdoSomethingのメソッドを呼び出す
呼び出しInterceptorClass方法:の後に

()----------------
免責事項:この記事はCSDNブロガーであります「李白CSDNのオリジナルの記事、CC 4.0 BY-SAの著作権契約書に従って、再現し、元のソースのリンクと、この文を添付してください。
オリジナルリンクします。https://blog.csdn.net/zjl_pcw/article/details/80505114

過去の推奨:

最悪のパフォーマンスの最適化Tomcat8

オーダーJingdongはホーム・センターあたり5億クエリの日平均、家庭なぜESとMySQLの?

4つのマップは、Tomcatのシステム・アーキテクチャを通してあなたを取る-インタビュアーがTomcatのシリーズを震え答えることができます!

「12306」最後にどのように高速なハードウェアアーキテクチャ-芸術的スパイクシステム

なぜアリババは90秒100億に耐えましたか?-道路の非常に同時サーバー分散アーキテクチャの進化

B2Bのビジネスプラットフォーム--ChinaPayあるChinaPay機能

学ぶ飼育係がロックを分散し、インタビュアーがあなたを感動させて

マイクロ-Redisson分散ロックサービスプログラムスパイクSpringCloudの電気の供給

公共号0.0の深い魂

公開された24元の記事 ウォン称賛64 ビュー20000 +

おすすめ

転載: blog.csdn.net/a1036645146/article/details/104036696