spring aspect

面向切面編程,代碼如下:

@Aspect
public class ControllorAspectj {

@Pointcut("within(com.spring.test.action.*)")
public void doManagerActionClass() {
}

@Before("execution(public * * (..))")
public void getUser(JoinPoint jp) throws IOException {

System.out.println("任意公共方法的執行");
}

@Pointcut("execution(* do*(..))")
public void doMethod(){
}

@Before(value="com.spring.test.common.ControllorAspectj.doMethod() && target(bean)",argNames="bean")
public void beforeDo(JoinPoint jp,Object bean) throws Exception {
String sourceLocation=jp.getKind();

Signature signature=jp.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method method = methodSignature.getMethod();
method.invoke(jp.getTarget(),jp.getArgs());
System.out.println("方法名:"+method.getName());
System.out.println("任意以do開頭的方法"+sourceLocation);
}

@Pointcut("within(com.spring.test..*)")
public void before3(){
System.out.println("test包以及他的子包");
}


@AfterThrowing(pointcut="com.spring.test.common.ControllorAspectj.before3()",throwing="ex")
public void afterThrows(JoinPoint jp,Throwable ex) {
ex.printStackTrace();
System.out.println("test包以及他的子包拋出的異常"+ex.getMessage());
}

@AfterReturning("this(com.spring.test.IBaseAction)")
public void afterReturn(){
System.out.println("after return,實現了IBaseAction");
}

}


注:任何通知方法可以將第一個參數定義爲org.aspectj.lang.JoinPoint類型 (環繞通知需要定義第一個參數爲ProceedingJoinPoint類型, 它是 JoinPoint 的一個子類)。

以上注意幾點:
1、該類聲明爲@Aspect;
2、在spring配置文件中聲明:
<aop:aspectj-autoproxy proxy-target-class="true"/>
<bean id="controllerAspect"
class="com.spring.test.common.ControllorAspectj"/>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章