Spring编程<六>
接上次AOP的四中方法:第三种 注解形式
使用注解添加,是很简单是,演示一个例子:
第一种方式,注解加在函数上:
@Aspect
public class MyAdvisor {
@Pointcut(value="execution( * cn..Cat.*(..) )") //由Pointcut中的values属性来指定 切点的表达式----aspectj切点语言
public void a(){
}
//由通知的value属性指定Pointcut----本例为aa()方法上的切点
@Before(value="a()")
public void before(){
System.out.println("...前面拦截..");
}
@After(value="a()")//手动添加JoinPoint参数,可以活的被拦截的 连接点的信息
public void after(JoinPoint jp){//缺点,依赖JoinPoint类,因此没必要就不需要
//是否为方法执行,被拦截方法名,被拦截对象
System.out.println("...后面拦截.."+jp.getKind()+","+jp.getSignature()+","+jp.getTarget());
}
@Around(value="a()")//around通知的拦截方法,必要依赖jp或p,因为需要放行
public void around(ProceedingJoinPoint p) throws Throwable{
//ProceedingJoinPoint extends JoinPoint
System.out.println("前面拦.."+p.getKind()+","+p.getSignature()+","+p.getTarget());
p.proceed();//放行
}
@AfterReturning(value="a()")
public void afterReturn(){//该方法可以注入ProceedingJoinPoint
System.out.println("方法正常返回之后:");//抓异常
}
@AfterThrowing(value="a()")
public void afterThrowing(){//该方法可以注入ProceedingJoinPoint
System.out.println("方法抛出异常之后:");//抛异常
}
}
第二种方式:注解添加在变量上:
//切面=切点+通知
//@Aspect = @PointCut + (@Before | @After ...)
@Aspect
public class MyAdvisor2 {
private final String CUT="execution( * cn..Cat.*(..) )";
@Before(CUT)
public void before(){
System.out.println("...前面拦截..");
}
}
然后还要在xml中配置:
<!-- 自动代理的标签 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<bean id="p1" class="cn.hncu.v3.Person"></bean>
<bean id="cat" class="cn.hncu.v3.Cat"></bean>
<!-- 基于注解的切面 -->
<!-- <bean class="cn.hncu.v3.MyAdvisor"></bean> -->
<bean class="cn.hncu.v3.MyAdvisor2"></bean>