前几天学习了Spring AOP 想应用在项目中完成控制层的日志展示。
将请求@RequestMapping注解的方法的request对方和返回的result(自定义类型)抓取到,进行日志管理
使用了@AfterReturning
返回前通知 中获取request的方法不能通过joinPoint.getArgs()方法,得通过如下方法
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
Spring上下文中会记录request的对象
现在对遇到的几个问题进行下总结。
1、AOP代理的类,必须是在程序起来时,加载完毕的(装配到beanFactory)中的,对业务中后期创建的对象(new 出来的)不会被切面捕捉到。得通过getBean().
2、对于控制层@Controller标记的类中的@ReuqestMapping方法,当
<context:component-scan base-package="com.wenzy.xx">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service">
</context:component-scan>
和
<aop:aspectj-autoproxy proxy-target-class="true"/>
不在同一个xml中,会出现@Controller中的方法切不到的情况。
3、另想要直接切被@RequestMapping注解的方法,在切点定义时可以写为
@Poincut("@annotation(org.springframework.web.bind.annotation.RequestMapping) && execution(* com .wenzy..*(..))")
&&后面的为指定包(正则表达式) 这样就可以将两种条件结合起来了。