applicationContext.xml
< aop: config>
< aop: aspect ref = " myadvice" >
< aop: pointcut id = " mypoint" expression = " execution(* cn.wit.test.Demo.Demo1())" />
< aop: before method = " mybefore" pointcut-ref = " mypoint" />
< aop: after method = " myafter" pointcut-ref = " mypoint" />
< aop: after-returning method = " afterreturn" pointcut-ref = " mypoint" />
< aop: around method = " myarround" pointcut-ref = " mypoint" />
</ aop: aspect>
</ aop: config>
< bean id = " demo" class = " cn.wit.test.Demo" > </ bean>
myadvice
其中after标签和afterreturning标签的区别是after异常了也会执行后置通知
afterreturning标签对应的方法有异常就不会执行
public class MyAdvice {
public void mybefore ( ) {
System. out. println ( "前置" ) ;
}
public void myafter ( ) {
System. out. println ( "后置" ) ;
}
public void afterreturn ( ) {
System. out. println ( "后置returning" ) ;
}
public Object myarround ( ProceedingJoinPoint p) throws Throwable{
System. out. println ( "环绕-前置" ) ;
Object result = p. proceed ( ) ;
System. out. println ( "环绕-后置" ) ;
return result;
}
}
测试
传参
aspectJ相比于schema-based,传参要麻烦很多
下面有一份前置通知,demo1方法有int和string两个参数
applicationContext.xml
args(int id1,String name1)中参数来自于切点方法(int id,String name),参数个数、类型和顺序必须一致
args后边的参数、 arg-names(int id1,String name1)的参数类型和参数名必须一致
advice(int id2,String name2)中参数必须和arg-names参数个数、类型和顺序一致
< bean id = " myadvice" class = " cn.wit.advice.MyAdvice" > </ bean>
< aop: config>
< aop: aspect ref = " myadvice" >
< aop: pointcut id = " mypoint" expression = " execution(* cn.wit.test.Demo.Demo1(int,String)) and args(id1,name1)" />
< aop: before method = " mybefore" pointcut-ref = " mypoint" arg-names = " id1,name1" />
</ aop: aspect>
</ aop: config>
< bean id = " demo" class = " cn.wit.test.Demo" > </ bean>
myadvice
public class MyAdvice {
public void mybefore ( int id2, String name2) {
System. out. println ( "前置" + id2+ name2) ;
}
}
测试
public class Test {
public static void main ( String[ ] args) {
ApplicationContext ac= new ClassPathXmlApplicationContext ( "applicationContext.xml" ) ;
Demo demo = ac. getBean ( "demo" , Demo. class ) ;
try {
demo. Demo1 ( 1 , "张三" ) ;
} catch ( Exception e) {
}
}
}