spring 2.0 技术手册 第4.3.3 ControlFlowPointcut示例中执行会抛出空指针异常,原因为Some.java中的setApplicationContext方法未被调用,则helloEverybody 方法被调用是helloProxy为null,在SpringAOPDemo.java的some实例化后加上"some.setApplicationContext(context);"此句即可。
spring 2.0 技术手册 第4.4.1 IntroductionInterceptor示例中,对OtherIntroduction类中被调用的org.aopalliance.intercept.MethodInvocation类补充说明:
org.aopalliance.intercept.MethodInvocation类继承至org.aopalliance.intercept.Invocation类,MethodInvocation类对一个方法的调用行为进行描述,并在方法被调用前插入一个拦截器。其中方法getMethod()方法返回的是被描述的方法的Method实例,getArguments()方法由父类继承而来,返回的是被描述方法的参数列表Object数组。
补充了相应解释的示例代码如下:
/** */
/**
*
*/
package onlyfun.caterpillar;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.IntroductionInterceptor;
/** */ /**
* @author lecky
*
*/
public class OtherIntroduction implements IntroductionInterceptor, IOther ... {
// 是否实现自IOther接口
/**//*
* (non-Javadoc)
*
* @see org.aopalliance.intercept.MethodInterceptor#invoke(org.aopalliance.intercept.MethodInvocation)
*/
public Object invoke(MethodInvocation arg0) throws Throwable ...{
// 如果执行的方法来自IOther接口的定义
// comment by lecky
// MethodInvocation类的作用是对一个方法的调用行为进行描述,
// 并在方法被调用前插入一个拦截器
if (implementsInterface(arg0.getMethod().getDeclaringClass())) ...{
// 执行额外加入(mixin)的行为
return arg0.getMethod().invoke(this, arg0.getArguments());
// comment by lecky
// 此处arg0.getMethod()即为被调用的方法实例,arg0.getArguments()则是该方法的参数列表
} else ...{
return arg0.proceed();
}
}
/**//*
* (non-Javadoc)
*
* @see org.springframework.aop.DynamicIntroductionAdvice#implementsInterface(java.lang.Class)
*/
public boolean implementsInterface(Class arg0) ...{
// TODO Auto-generated method stub
return arg0.isAssignableFrom(IOther.class);
}
/**//*
* (non-Javadoc)
*
* @see onlyfun.caterpillar.IOther#doOther()
*/
public void doOther() ...{
// TODO Auto-generated method stub
System.out.println("增加的职责");
}
}
*
*/
package onlyfun.caterpillar;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.IntroductionInterceptor;
/** */ /**
* @author lecky
*
*/
public class OtherIntroduction implements IntroductionInterceptor, IOther ... {
// 是否实现自IOther接口
/**//*
* (non-Javadoc)
*
* @see org.aopalliance.intercept.MethodInterceptor#invoke(org.aopalliance.intercept.MethodInvocation)
*/
public Object invoke(MethodInvocation arg0) throws Throwable ...{
// 如果执行的方法来自IOther接口的定义
// comment by lecky
// MethodInvocation类的作用是对一个方法的调用行为进行描述,
// 并在方法被调用前插入一个拦截器
if (implementsInterface(arg0.getMethod().getDeclaringClass())) ...{
// 执行额外加入(mixin)的行为
return arg0.getMethod().invoke(this, arg0.getArguments());
// comment by lecky
// 此处arg0.getMethod()即为被调用的方法实例,arg0.getArguments()则是该方法的参数列表
} else ...{
return arg0.proceed();
}
}
/**//*
* (non-Javadoc)
*
* @see org.springframework.aop.DynamicIntroductionAdvice#implementsInterface(java.lang.Class)
*/
public boolean implementsInterface(Class arg0) ...{
// TODO Auto-generated method stub
return arg0.isAssignableFrom(IOther.class);
}
/**//*
* (non-Javadoc)
*
* @see onlyfun.caterpillar.IOther#doOther()
*/
public void doOther() ...{
// TODO Auto-generated method stub
System.out.println("增加的职责");
}
}