AspectFlowみたいな。
今日の禿会で、ちょっと出た話。
- 複数のアスペクトを1つの塊として捉えて、対象となるオブジェクトに適用したい感じ。
- その塊は、定義上それなりに自由にコンポジット出来ると良い感じ。
と、言う訳で、AopProxyとかMethodInvocationImpl辺りを眺めてみる…。
何か大変な事になっとる…。特に、AopProxy…。知らないコードがイパーイ。
あんまり大変なコードを書き出すと、1:Nマッピングの方が疎かになりそうなので、
S2に手を入れずに、作る方法を考えてみる。3分で出来たのがこんな感じ。
public class InterceptorFlowInterceptor implements MethodInterceptor, Serializable {
private List interceptors_ = new ArrayList();
public Object invoke(MethodInvocation invocation) throws Throwable {
MethodInvocationProxy proxy = new MethodInvocationProxy(invocation);
return proxy.proceed();
}
public void addInterceptor(MethodInterceptor interceptor) {
interceptors_.add(interceptor);
}
public void addInterceptors(InterceptorFlowInterceptor interceptors) {
interceptors_.addAll(interceptors.interceptors_);
}
private class MethodInvocationProxy implements MethodInvocation {
private MethodInvocation invocation_;
private int interceptorsIndex_ = 0;
private MethodInvocationProxy(MethodInvocation invocation) {
invocation_ = invocation;
}
public Object[] getArguments() {
return this.invocation_.getArguments();
}
public Method getMethod() {
return this.invocation_.getMethod();
}
public AccessibleObject getStaticPart() {
return this.invocation_.getStaticPart();
}
public Object getThis() {
return this.invocation_.getThis();
}
public Object proceed() throws Throwable {
while (interceptorsIndex_ < interceptors_.size()) {
return ((MethodInterceptor)
interceptors_.get(interceptorsIndex_++)).invoke(this);
}
return this.invocation_.proceed();
}
}
作ってみた後に、そう言えばAbstractInterceptorってあったような…と、コード見る。
あぅあ…、id:koichikさんの言ってたgetComponentDefってこれくぁ……。
簡単に作ったやつじゃ、上手く動かないデスヨ…。残念…。考え直しますです。