私はSpringAOPをプログラムで実装することで遊んでいます。与えられたMethodInterceptorsのリストを使用してAOPObject.classプロキシを生成する単純なファクトリクラスを作成しました。
public class AOPProxyFactoryBean implements FactoryBean<Object> {
private List<MethodInterceptor> methodInterceptors = new ArrayList<MethodInterceptor>();
public Object getObject() throws Exception {
Object o = new Object();
ProxyFactory proxyFactory = new ProxyFactory(o);
for (MethodInterceptor methodInterceptor : methodInterceptors) {
proxyFactory.addAdvice(methodInterceptor);
}
return proxyFactory.getProxy();
}
public Class<?> getObjectType() {
return Object.class;
}
public boolean isSingleton() {
return false;
}
public void setMethodInterceptors(List<MethodInterceptor> methodInterceptors) {
this.methodInterceptors = methodInterceptors;
}
単純なインターセプター:
public class SimpleMethodInterceptor implements MethodInterceptor {
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("SimpleMethodInterceptor: " + invocation.getMethod().getName());
return invocation.proceed();
}
}
Spring XML構成:
<bean id="simpleMethodInterceptor" class="...SimpleMethodInterceptor"/>
<bean id="objectAOPProxyFactoryBean" class="...AOPProxyFactoryBean">
<property name="methodInterceptors">
<list>
<ref bean="simpleMethodInterceptor"/>
</list>
</property>
</bean>
ここのドキュメントで は、addAdvice(アドバイスアドバイス)について次のように読むことができます。'...与えられたアドバイスは、toString()メソッドを含め、プロキシ上のすべての呼び出しに適用されることに注意してください!...'
したがって、SimpleMethodInterceptorによってインターセプトされたObject.classメソッドへのすべての呼び出しを取得することを期待しています。
テスト:
@Test
public void aopTest() {
Object o = (Object) applicationContext.getBean("objectAOPProxyFactoryBean");
o.toString();
o.equals(o);
o.getClass();
}
この出力を与えます:
SimpleMethodInterceptor:toString
toString()メソッドのみがインターセプトされたようです。なぜですか?