AOP有啥作用?
为啥要用aop?
需求在哪?
设定一种情况:你只负责你自己部分的代码,其他人也只负责各自的代码,那么要是要求你们各自做的功能模块先后使用,且不能修改各自的代码,该如何做?
这就是aop的应用场景——即在不改各自代码的情况下实现功能叠加增强
接下来做个demo,顺序大致为:
1)在pom文件中导入坐标,
2)创建目标接口与目标类(这就是被增强的方法,即切点)
3)创建切面类(这就是增强方法)
4)将目标类和切面类的对象创建权交给spring
5)在xml中配置(配置织入关系)
6)测试是否成功
1)
2)与3)
目标接口
目标类
切面类
4)同样创建springconfig的xml,配置
5)织入配置
首先要引入aop的命名空间
(灰色部分)
配置aop
配置好后测试
这里使用一下spring集成junit来测试
先导入spring-test坐标
然后编写测试类
执行后结果为
前置增强成功
成功实现了不改变两个类的代码的情况下让功能融合了起来
———————————————————————
切点表达式的写法(即被增强的方法):
pointcut属性的表达式写法为——execution([修饰符] 返回值类型 包名.类名.方法名(参数))
其中修饰符可省略
返回值类型、包名、类名、方法名可以使用*代替,表示任意
参数可以使用…代替,表示任意
例子:
execution(public void com.wzy.aop.target.method())
指特定的方法
execution(void com.wzy.aop.target.*(..))
指定类中的任意方法,参数为任意
execution(* com.wzy.aop.*.*(..))
指定任意返回值的aop包下的任意类的任意方法,⭐常用这种
execution(* *..*.*(..))
搞笑的
————————————————————
增强除了前置类型还有哪些?
(通知和增强在这是一个意思)
1.前置通知——<aop:before>
2.后置通知——<aop:after-turning>
3.环绕通知——<aop:around>
:
如何写环绕加强方法?
配置xml
测试即可
4.异常抛出通知——<aop:throwing>
:即如果切点方法有异常就执行切面方法。
注意!!!这个切面方法不能有异常
5.最终通知——<aop:after>
:无论如何都会执行的切面方法
————————————————————————
抽取切点表达式:
若加强的是同一个切点,则可以将切点表达式抽取出来
例子:前置加强和后置增强都增强同一个方法
我比较懒,前置增强和后置增强都用同一个方法
抽取切点表达式后
切点被抽出来并用before这个id表示,增强时切点就用ref连上id就行