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