使用aspectJ实现aop基本步骤:
1.新建maven项目
2.加入依赖
1)spring依赖
<!--spring依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
2)aspectJ依赖
<!--aspectJ依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
3)junit单元测试
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
添加依赖.png
3.创建目标类:接口和它的实现类
要做的事给类中的方法增加功能
创建接口的实现类.png
4.创建切面类(普通类)
1)在类的上面加入@Aspect
2)在类中定义方法。
方法就是切面要执行的功能代码,在方法上面加入aspectJ中的通知注解,例如@Before。有需要只当切入点表达式execution()
定义切面要执行的功能代码.png
加入通知注解与切入点表达式.png
5.创建spring的配置文件:声明对象,把对象交给容器统一管理。对象可以使用注解或xml配置文件<bean>
1)声明目标对象
2)声明切面类对象
声明切面对象.png
3)声明aspectJ框架中的自动代理生成器标签
自动代理生成器:用来完成代理对象的自动创建功能
声明自动代理生成器.png
<aop:aspectj-autoproxy/>:会把容器所有对象都找到,然后按照切入点表达式的声明信息,找到目标并生成它的代理。会把容器中所有符合条件的目标都生成代理。
6.创建测试类
从spring容器中获取目标对象(实际就是代理对象)。通过代理执行方法,实现aop的功能增强。
JoinPointd指定通知方法中的参数(所有通知都可以用)
作用:可以在通知方法中获取方法执行时的信息,例如方法名称、方法的实参。
这个JoinPointd参数的值是由框架赋予,必须是第一个位置的参数
JoinPoint获取方法执行时的信息
@Before前置通知
上例使用的就是@Before通知
@AfterReturning后置通知
属性:1.value切入点表达式
2.returning自定义的变量,表示目标方法的返回值
自定义变量名必须和通知方法的形参名一样
位置:在方法定义的上面
特点:1.在目标方法之后执行
2.能够获取目标方法的返回值,可以根据返回值做不同的处理和功能
3.可以修改这个返回值
@Around环绕通知(功能最强的通知)
环绕通知方法的定义格式:
1.public
2.必须有一个返回值,推荐使用Object
3.方法名称自定义
4.方法有参数,固定的参数ProceedingJoinPoint
@Around:环绕通知
属性:value 切入点表达式
位置:在方法的定义上面
特点:
1.功能最强的通知
2.在目标方法的前和后都能增强功能
3.控制目标方法是否被调用执行
4.修改原来的目标方法的执行结果,影响最后的调用结果
环绕通知,等同于jdk动态代理的InvocationHandler接口
参数 ProceedingJoinPoint等同于Method,作用:执行目标方法
返回值:就是目标方法的执行结果,可以被修改
控制目标方法的执行
不符合条件,目标方法不执行
修改目标方法的执行结果
修改结果前,返回值为doFirst.png 修改执行结果后.png@AfertThrowring异常通知(了解内容)
异常通知方法的定义格式
1.public
2.没有返回值
3.方法名称自定义
4.方法有一个Exception,如果有就是JoinPoint
属性:
1.value切入点表达式
2.throwing自定义的变量,表示目标方法抛出的异常对象
变量名必须和方法的参数名一样
特点:
1.在目标方法抛出异常时执行
2.可以做异常的监控程序,监控目标方法执行时是不是有异常。
如果有异常,可以发送邮件、短信进行通知
在目标方法抛出异常时执行.png
@After最终通知(了解内容)
最终通知方法的定义格式
1.public
2.没有返回值
3.方法名称自定义
4.方法没有参数,如果有就是JoinPoint
@After:最终通知
属性:value切入点表达式
位置:在方法上面
特点:
1.总是会执行
2.在目标方法之后执行
即使抛出异常也会执行
@Pointcut定义切入点
@Pointcut:定义管理切入点,如果项目中有多个重复的切入点表达式 ,可使用@Pointcut。
访问权限:一般是private,因为不需要被外界调用
属性:value 切入点表达式
位置:自定义的方法上面
特点:当使用@Pointcut定义在一个方法上面,此时这个方法的名称
就是切入点表达式的别名。其他通知中的value属性就可以使用
这个方法名称代替切入点表达式。
切面类中有多个重复的切入点表达式
使用cglib实现aop:
无接口时自动使用cglib动态代理
没有接口spring框架自动使用cglib动态代理.png有接口时使用cglib动态代理
cglib能继承就行
网友评论