亲自实践AOP,遇到的问题:(请把图一与图二进行对比,会发现环切代码的意义是什么)
一、直接看下图,类中的方法1与方法2;
方法1:首先创建连接点;
方法2:对已创建的环切点进行环切;
@Pointcut("execution(* com.zrar..*BLH.*(..))")
public void pointCut2(){}
@Around("pointCut2()")
public Object businessLog(ProceedingJoinPoint pjp) throws Throwable{
}
方法1加上方法2等效于=====以下方法:
@Around("execution(* com.zrar..*BLH.*(..))")
public Object businessLog(ProceedingJoinPoint pjp) throws Throwable{
}
PS:我们会发现在环切的时候,执行的方法里面还有通配符;
首先是:包名 然后是: 类名 然后是方法名:方法名 括号内是:参数
*.表示通配包名 *. == com.
com.zrar.easyweb.web.core.annotation == *.*.*.*.*.*.
..表示 通配任何包及其子包 例如 com.. ==com. *.*.*.
com.zrar.. 最后的两个点,表示的是一个或者多个通配任何包及子包;
*BLH:在我开发的环境中,我们所创建的类是以BLH结尾的。所以采用了通配符的形式来表达,因为此次切面的作用是对整个系统的所有功能进行切,保留用户在浏览时的痕迹。
*(..):表示的是方法加参数。*是所有方法,括号里的点点 是所有的参数(零个或者多个)
二、以下代码是环切的核心代码;若不是环切,以下代码不可用!
Object returnVal = null;
Class targetClass = pjp.getTarget().getClass();
Signature s = pjp.getSignature();
MethodSignature ms = (MethodSignature) s;
Method method = ms.getMethod();
returnVal = pjp.proceed();
第一行代码:返回类型
第二行代码:获取目标类
第三、四行代码:获取目标方法
第五行代码:获取完整的方法,第一张图与下面这张图对应的关系。首先获取其类再就是类下首先被执行的方法。
三、http的请求获取其值,这个作用就是获取当前登录用户的IP地址,URL等
HttpServletRequest request = RequestUtil.getRequest();
四、注意事项;
如若在环切保存信息的时候,表中存了两条记录的话,那说明我们环切进行了两次。遇到此问题的解决方案:
1、类中加了@Aspect注解的话,那么就不需要配置bean。同时进行就会产生两条记录。
遇到的坑,望大家不要踩进去!!