AOP - 3原則基本となる実装

  図1に示すように、インタフェースおよび実装のコアビジネス

パブリック インターフェイスのiManager { 

    ボイド追加(文字列の項目)。
}
コードの表示

 

パブリック クラス IManagerImplは、実装のiManager { 

    プライベートリスト<文字列>リスト= 新しいのArrayListを<> (); 

    @Override 
    公共 ボイドは(文字列の項目){追加
        list.add(項目)。
    } 
}
コードの表示

 

図2に示すように、インタフェースおよび実装の通知

パブリック インターフェース情報{ 

    ボイドbeforeAdvice(); 

    無効afterAdviceを(); 
}
コードの表示

 

パブリック クラス AdviceImplは、実装のアドバイス{ 

    @Override 
    公共 無効beforeAdvice(){ 
        System.out.printlnは( "メソッドの開始時間を:" + のSystem.currentTimeMillis()); 
    } 

    @Override 
    公共 ボイドafterAdvice(){ 
        System.out.printlnは( "メソッドの終了時間:" + のSystem.currentTimeMillis())。
    } 
}
コードの表示

 

(通知部のコアビジネスに関連する)3、動的プロキシクラス

パブリック クラス ProxyFactory 実装のInvocationHandler {の

    // プロキシオブジェクト
    のプライベートオブジェクトのターゲット;
     // 通知
    プライベートアドバイスアドバイスに; 

    / ** 
     *返されたプロキシオブジェクトの移動対象オブジェクトは、
     * @return 
     * / 
    パブリックオブジェクトgetProxy(){ 
        プロキシオブジェクト = たとえば、Proxy.newProxyInstance (target.getClass()のgetClassLoader()、
                target.getClass()でgetInterfaces(),. );
         戻り、プロキシを
    } 

    @Override 
    パブリック([]引数オブジェクト、プロキシ、メソッド、メソッドオブジェクト)オブジェクトを呼び出しスローのThrowable { 
        advice.beforeAdvice()。
        オブジェクトOBJ = method.invoke(ターゲット、引数)。
        advice.afterAdvice(); 
        返すOBJを。
    } 

    パブリックオブジェクトでgetTarget(){
         戻りターゲット; 
    } 

    公共 ボイドがsetTarget(オブジェクトターゲット){
         この .TARGET = ターゲット。
    } 

    公共情報getAdvice(){
         リターンアドバイス。
    } 

    公共 ボイドsetAdvice(アドバイスアドバイス){
         この .advice = アドバイス。
    }
}
コードの表示

 

  4、代理店、ビジネスを達成反映し、コンフィギュレーションファイルを介して通知します

パブリック クラスたBeanFactory { 

    プロパティの小道具 = 新しい新しいプロパティ(); 

    パブリックたBeanFactoryを(のInputStream INPUT){
         試み{ 
            prop.load(INPUT); 
        } キャッチ(IOExceptionをE){ 
            e.printStackTrace(); 
        } 
    } 

    / ** 
     *プロキシを取得します(オブジェクトエージェント)例
     * @paramの
     * @return 
     * / 
    パブリックオブジェクトgetBean(文字列名){
         // クラス名ProxyFactory取得 
        文字列クラス名= prop.getProperty(名前+ ".proxyを" );
        プロキシオブジェクト   = ヌル;
         試み{
             // クラスオブジェクトProxyFactory取得 
            クラス= proxyClass ; Class.forNameの(クラス名)を
            プロキシ = proxyClass.newInstance(); 

            //はアドバイスプロファイルに基づいて、ターゲットオブジェクトをインスタンス化し 
            、オブジェクトのターゲット= Class.forNameの( prop.getProperty(名前+ ".TARGET" ))のnewInstance()は;. 
            アドバイスオブジェクト = Class.forNameの(prop.getProperty(名前+ ".adviceを" ))のnewInstance(); 

            // イントロスペクションによって達成ProxyFactory属性割り当て 
            のBeanInfoのBeanInfo = Introspector.getBeanInfo(proxyClass)。
            PropertyDescriptor [] propertyDescriptorsの =のbeanInfo.getPropertyDescriptors()。
            (のPropertyDescriptorのPD:propertyDescriptors){ 
                文字列プロパティ名 = pd.getName()。
                方法writeMethod = pd.getWriteMethod()。
                もし( "ターゲット" .equals(プロパティ名)){ 
                    writeMethod.invoke(プロキシ、ターゲット)
                } そう であれば( "アドバイス" .equals(プロパティ名)){ 
                    writeMethod.invoke(プロキシ、アドバイス)。
                } 
            } 
        } キャッチ(ClassNotFoundExceptionが電子){ 
            e.printStackTrace(); 
        } キャッチ(IllegalAccessExceptionが電子){ 
            e.printStackTrace(); 
        } キャッチ(ないInstantiationException電子){ 
            e.printStackTrace(); 
        } キャッチ(IntrospectionException電子){ 
            e.printStackTrace(); 
        } キャッチ(にInvocationTargetException電子){ 
            e.printStackTrace(); 
        } 
        戻りプロキシ。
    } 
}
コードの表示

 

5、テスト

パブリック クラスAopTest { 

    公共 静的 ボイドメイン(文字列[]引数){
         // 設定ファイルを読み取る 
        入力ストリーム入力= にThread.currentThread()getContextClassLoader()。
                .getResourceAsStream( "CN / latiny / AOPA / bean.properties" ); 
        
        / / ファクトリクラスビーン作成 
        たBeanFactoryたBeanFactory = 新しい新たBeanFactory(入力); 
        
        // プロキシを得るオブジェクト 
        ProxyFactory ProxyFactory =(ProxyFactory)BeanFactory.getBean( "豆"を); 
        
        // プロキシオブジェクトを介して呼び出す 
        iManagerの豆= (iManagerなど)proxyFactory.getProxy (); 
        bean.add( "Latiny"); 
    } 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/Latiny/p/10786452.html