図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"); } }