AOP之:ダイナミックエージェントによるブロックチェーンの実現


Java APIでは、AOPブロッキング操作を実現できる動的エージェント関連パッケージのセットが提供されており、実際にはほとんどのAOP実装はJAVA動的エージェントに基づいているが、java APIでは、複数のブロッキングが同じオブジェクトメソッドをブロックするなどの「チェーン」エージェントは実現されていない.もちろん、ほとんどのAOP実装およびオープンソースのフレームワークは「チェーン」エージェントを実現している.自分もちょうど最も簡単な実現を書いてみました.
  まず、ビジネスロジックインタフェースとその実装クラスを定義します.

	interface Biz {
		void doBiz();
	}
       class BizImpl implements Biz {
		public void doBiz() {
			System.out.println("          ");
		}
	}

   次に,n(ここでは2つしか実現していない)個のブロッキングを定義する必要がある.

	class BizInvocationHandler1 implements InvocationHandler {
		Biz biz = null;

		public BizInvocationHandler1(Biz biz) {
			this.biz = biz;
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object,
		 * java.lang.reflect.Method, java.lang.Object[])
		 */
		public Object invoke(Object proxy, Method method, Object[] args)
				throws Throwable {
			System.out.println("    1  ");
			Object result = method.invoke(biz, args);
			System.out.println("    1  ");
			return result;
		}
	}
	
   class BizInvocationHandler2 implements InvocationHandler {
		Biz biz = null;

		public BizInvocationHandler2(Biz biz) {
			this.biz = biz;
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object,
		 * java.lang.reflect.Method, java.lang.Object[])
		 */
		public Object invoke(Object proxy, Method method, Object[] args)
				throws Throwable {
			System.out.println("    2  ");
			Object result = method.invoke(biz, args);
			System.out.println("    2  ");
			return result;
		}
	}

  最後にテストコード

		Biz biz = new BizImpl();
		InvocationHandler handler1 = new BizInvocationHandler1(biz);
		Biz prox1 = (Biz)Proxy.newProxyInstance(Biz.class.getClassLoader(), new Class[]{Biz.class}, handler1);
		
		
		InvocationHandler handler2 = new BizInvocationHandler2(prox1);
		Biz prox2 = (Biz)Proxy.newProxyInstance(Biz.class.getClassLoader(), new Class[]{Biz.class}, handler2);
		prox2.doBiz();

出力結果は次のとおりです.

    2  
    1  
          
    1  
    2  

  分析:
     1.ビジネスロジックメソッドが呼び出される前に定義された2つのブロッカーがブロックに成功し、同じ理屈でnつのブロッカーがn回ブロックされる(struts 2などのオープンソースプロジェクトの実現もそうではないか.いつソースコードをよく読んでから結論を下すか)
     2.エージェントによって最初に実行されるブロッキングは最後に実行され、典型的なスタックの先進的な後出は、「チェーン」エージェントを実現するにはスタックを利用する必要があるようだ.