今天价绍的是AspectJ的注解开发:
一 AOP术语
要想面向切面编程,我们首先得了解一些基本的术语以及几种不同的通知:
1.target目标类:需要被代理的类,我们可以简单的理解为需要服务层中需要公共模块能力的类;
2.JoinPoint连接点:可能被拦截的方法(服务层中所有的方法);
3.CutPoint切入点:需要被增强的方法,也即需要公共能力(事务)的方法,当然查找时不需要的;
4.Advice:通知:它指的就是公共模块的能力;
5.Weaving织入:它是一个虚拟的概念,把通知应用到目标类中创建代理的过程就叫做织入;
6.Proxy代理类:由Spring提供的代理类来完成通知和切入点的整合
7.Aspect切面:连接点和Advice的结合,比如说将日志这种能力加如到tel()这个方法中,就形成一个切面,当你每次调用这个方法的时候,也同时回执行这个dan
注意:Aop用到的地方就是项目的服务层,其实IOC与DI就是用来给服务层中的一些属性复制的;
再上面的七个名词当中Advice有有三中不同的类型:
1.前置通知 MethodBeforeAdvice
2.后置通知:afterreturnAdvice
3.环绕通知:around
注解还是之前再IOC里面将的那些注解在加上一下注解:
@Before @AfterReturning @Around @Aspect 具体用法将会再下文中提到:
1首先我们同样应该创建通知类,但创建通知类的时候应该加注解,还有一些要注意的点:
1) 我们应该先建一个通知类再类名之前
加注解@Component 然后再加 @Aspect—表面这是一个切面
2) 在类里面我们应该首先创建一个切点函数(我是这么命名的方便理解)、
切面函数的特点就是没有参数 没有函数体 而且函数名称随意(本文以myPoint为例);
在这个函数之上我们加注解
@PointCut(“ execution(* com.ww.service.*.*(..))”)//切入点表达式+PointCut声明表面这是一个切入点;
3) 首先类创建前置通知
注解是@Before(“myPoint()”)
这样的注解,首先Before表示这是一个前置通知,括号内的函数表示切入点
配置文件扫描注解的时候,从这里得到切入点;代码如下:
@Before("mypoint()")
public void myBefore(JoinPoint joinPoint){这里的参数也要写和之前一样
System.out.println("前置通知");
}
4) 在来创建后置通知
注解是@AfterRuturning(“value=mypoint()”,returning=”res”)
同样AfterRuturning表示这是一个后置通知;
Value表示的是切入点,returning表示的是返回值,
读过前文应该都知道返回参数,这就不做赘述了。代码是:
@AfterReturning(value= "mypoint()",returning="res")
public void myAfter(JoinPoint joinPoint,Object res){
System.out.println("后置通知"+res);
}
这里再强调一下注意的地方:
第一:与之前在配置文件中配置后置通知时,参数的名称要与方法里的参数名称一致,同样在这里注解中的返回值名称也要和方法里的一样。
第二:为什么之前的几个没有value?
因为当你的参数只有一个的时候value是可以省略的;
有多个参数的时候要表明你的每一个参数代表什么所以必须写;
第三:也是小编经常犯的错误就是参数之间的逗号一定记得写,否则报错;
5) 最后来创建环绕通知
注解是@Around(“myPoint”)
意思一样就不多赘述代码如下:
@Around("mypoint()")
public Object myAround(ProceedingJoinPointproceedingJoinPoint) throws Throwable {
System.out.println("环绕钱");
Objecta=proceedingJoinPoint.proceed();//执行目标方法
System.out.println("还绕后");
return a;
}
解释一下:环绕通知的参数和之前的不一样它的类型是ProceedingJoinPoint
在这就是使用环绕通知是必须手动调用方法,用的就是参数.proceed()’;它是由返回值的;
2 我们来创建目标类
对于目标类与之前的区别IOC是注解的没什么区别注解就是
@Service(“该实现类的父接口名称”)
需要注意的就是注解一定是加在实现类上的,就像配置的时候class的值是它的实现类的包名+类名是一样的;
3我们类配置核心文件applicotionContext.xml
像之前一样注解方式我们只需要开启注解扫描即可
但是此处我们用的是AspectJ的注解方式,所以我们还应该开启的就是AspectJ的自动扫描,代码如下:
开启注解扫描
<context:component-scan base-package= "com.qf.advice,com.qf.service"></context:component-scan>
开启的就是AspectJ的自动扫描
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>