为了账号安全,请及时绑定邮箱和手机立即绑定

spring 基于aop 实现日志输出 定义在controller层无效

spring 基于aop 实现日志输出 定义在controller层无效

达令说 2019-02-21 01:07:10
业务场景:目前在开发一个web后端的程序,提供基于spring mvc的restful的接口给手机端调用。由于接口对性能和效率的要求比较高,为了更好的分析问题,这边决定输出日志对接口调用情况,以及频率,做记录。这边考虑基于spring的aop来实现日志切面编程,下面看代码:切面类 @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("最终通知"); } /** * 声明环绕通知 * @param pjp * @return * @throws Throwable */ @Around("pointCutMethod()") public Object doAround(ProceedingJoinPoint pjp) throws Throwable { System.out.println("进入方法---环绕通知"); Object o = pjp.proceed(); System.out.println("退出方法---环绕通知"); return o; } } 目标类 @Controller @RequestMapping(value="xxxx") @SuppressWarnings({ "rawtypes", "unchecked" }) public class CXXXController{ @ResponseBody @RequestMapping(value="/xxxx",method=RequestMethod.POST) public void xxxAuth(HttpServletRequest request){ //省略实际业务代码 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); 日志输出: 进入方法---环绕通知 前置通知 最终通知 例外通知 null 证明当前配置已经ok,测试效果达到预期。但是用tomcat启动时,通过http访问到controll时,并没有进入切面类,更别说通知方法了,请问这是什么情况。我有一个模糊的假设就是,我在main方法里面是手动实实在在的用controll类去调用了方法,所以触发了通知的连接点条件,但是http访问时,通过spring的mvc分发,反射调用所以并没有触发连接点的条件。不知道我的假设是否正确,或者有相关的大神还请不吝赐教。
查看完整描述

4 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

right 同样的问题解决了 谢谢。

查看完整回答
反对 回复 2019-03-01
?
HUX布斯

TA贡献1876条经验 获得超6个赞

找了好久答案,原来在这里,赞

查看完整回答
反对 回复 2019-03-01
  • 4 回答
  • 0 关注
  • 438 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信