業(yè)務場景:目前在開發(fā)一個web后端的程序,提供基于spring mvc的restful的接口給手機端調用。由于接口對性能和效率的要求比較高,為了更好的分析問題,這邊決定輸出日志對接口調用情況,以及頻率,做記錄。這邊考慮基于spring的aop來實現(xiàn)日志切面編程,下面看代碼:切面類
@Aspect
public class CxxxAspect {
/**
* 定義一個切入點
*/
@Pointcut("execution(* com..controller.*Controller.*Auth(..))")
private void pointCutMethod() {
}
/**
* 聲明前置通知
*/
@Before("pointCutMethod()")
public void doBefore() {
System.out.println("前置通知");
}
/**
* 聲明后置通知
* @param result
*/
@AfterReturning(pointcut = "pointCutMethod()", returning = "result")
public void doAfterReturning(String result) {
System.out.println("后置通知");
System.out.println("---" + result + "---");
}
/**
* 聲明例外通知
*/
@AfterThrowing(pointcut = "pointCutMethod()", throwing = "e")
public void doAfterThrowing(Exception e) {
System.out.println("例外通知");
System.out.println(e.getMessage());
}
/**
* 聲明最終通知
*/
@After("pointCutMethod()")
public void doAfter() {
System.out.println("最終通知");
}
/**
* 聲明環(huán)繞通知
* @param pjp
* @return
* @throws Throwable
*/
@Around("pointCutMethod()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("進入方法---環(huán)繞通知");
Object o = pjp.proceed();
System.out.println("退出方法---環(huán)繞通知");
return o;
}
}
目標類
@Controller
@RequestMapping(value="xxxx")
@SuppressWarnings({ "rawtypes", "unchecked" })
public class CXXXController{
@ResponseBody
@RequestMapping(value="/xxxx",method=RequestMethod.POST)
public void xxxAuth(HttpServletRequest request){
//省略實際業(yè)務代碼
return result;
}
}
配置文件信息(保護個人隱私類名全路徑以xxxx代替)
<aop:aspectj-autoproxy proxy-target-class="true"/>
<bean id="caFaceAuthAspect" class="com.xxxxx.aspect.CxxxAspect"/>
通過main方法測試代碼:
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
context.start();
CAAuthController con=(CXXXController)context.getBean(CXXXController.class);
con.xxxAuth(null, null);
日志輸出:
進入方法---環(huán)繞通知
前置通知
最終通知
例外通知
null
證明當前配置已經(jīng)ok,測試效果達到預期。但是用tomcat啟動時,通過http訪問到controll時,并沒有進入切面類,更別說通知方法了,請問這是什么情況。我有一個模糊的假設就是,我在main方法里面是手動實實在在的用controll類去調用了方法,所以觸發(fā)了通知的連接點條件,但是http訪問時,通過spring的mvc分發(fā),反射調用所以并沒有觸發(fā)連接點的條件。不知道我的假設是否正確,或者有相關的大神還請不吝賜教。
添加回答
舉報
0/150
提交
取消