AOP切面

AOP
Aspect Oriented Programming面向方面编程或面向切面编程
AOP关注点是共同处理,可以通过配置将其作用到某一个或多个目标对象 上
好处是实现组件重复利用,改善程序结构,提供灵活性。将共通组件与目标对象解耦
注意:
AOP需要用到的包
aspectjrt.jar aspectjweaver.jar cglib.jar
2、AOP相关概念
1)横切关注点
对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
2)Aspect切面(方面)
就是对横切关注点的抽象。可以切入到多个目标对象,可多次使用
3)JoinPoint连接点
被拦截到的点或者拦截到的方法
4)PointCut切入点
对连接点进行拦截的定义
5)Target Object目标对象
6)Advice通知
拦截到连接点之后要执行的代码
例如:方法调用前、后、前后
7)weave织入
将切面应用到目标对象并导致代理对象创建的过程
8)introduction引入
在不修改代码的前提下,引入可以在运行时为类动态的添加一些方法或字段(二介切面)
9)AutoProxy动态代理
采用AOP之后,容器返回的对象是代理对象。用户在使用时,由代理对象调用切面组件和目标对象的功能
a、目标对象有接口采用JDK动态代理
b、目标对象没有接口采用CGLIB动态代理
3、通知类型
1)前置通知
aop:before
在目标方法调用之前执行。不能阻止后续执行,除非抛异常。
2)后置通知
aop:after-returning
在目标方法调用之后执行。目标方法正常结束才执行
可以得到目标方法的返回值
3)异常通知
aop:after-throwing
发生异常时执行,获取异常对象
4)最终通知
aop:after
调用之后执行
目标方法正常或异常都执行
5)环绕通知
aop:around
调用之前和之后执行,得到目标对象的类型和执行方法
这5中通知,在内部调用时这样组织:
try{
通知前置处理
环绕前置处理
调用目标对象方法
环绕后置处理
调用后置通知
}catch(Exception ex){
调用异常通知
}finally{
调用最终通知
}
4、切入点表达式 用于指定目标对象及其作用位置
1) execution(* com.tedu.day02.demo.UserServiceImpl.(…))
方法限定(修饰符 返回值类型 切入点类 切入点方法(参数) 异常抛出)
修饰符:可选,支持通配符(public/private/protected)
返回值类型:必填,支持通配符,可以使用
来匹配所有返回值类型
切入点类:可选,支持通配符,指定切入点类。这个类必须是接口实现类
切入点方法:必填,支持通配符,指定要匹配的方法名,可使用通配符来匹配所有的方法
这个方法必须是接口中的抽象方法,这是由方法的动态绑定决定的
参数:若无可不填,指定方法声明中的形参列表,支持两个通配符,即
和…
其中代表一个任意类型的参数,…代表零个或多个任意类型的参数
异常抛出,可选,支持通配符指定方法声明抛出的异常
2) within类型限定
within<类匹配模式>
比如within(com.tedu.day02.demo.UserServiceImpl),是within()函数能表达的最小粒度
即不能具体到方法,最小只能到类,而execution可以具体到方法。
within(com.day02.demo.UserServiceImpl)限定com.tedu.day02.demo.UserServiceImpl类中所有方法,
和execution(
com.day02.demo.UserServiceImpl.(…))效果相同
within(com.day02.
)
限定com.day02包下所有方法,不包含子包
within(com.day02…*)
限定com.day02包下所有方法,包含子包
within(com.day02.Mark *)
限定con.day02包及子包下带有@Mark注解的任何类(接口不行)的任何方法
3)this/target特性类型限定
target匹配目标对象的类型,即被代理对象的类型
this匹配的是代理对象的类型
this匹配的最终结果和最终生成的代理对象互不干涉
对于this(M),当M为类时,若一个类的CGLIB代理类型为M,该类的所有方法作为连接点织入到CGLIB代理对象中
当M为接口时,若一个类的JDK代理类型为M,该类实现的接口方法作为连接点织入JDK代理对象中,this的匹配结果不会
影响Spring生成代理对象的方式,若一个类继承了接口,则使用JDK代理,否则使用CGLIB代理,这就会出现下列情况:
A继承了B接口,this(“A”)会匹配到A,接着将A的所有方法织入到A的CGLIB代理对象中,但是因为A继承了B接口,
所以Spring生成的是JDK代理对象,此时不会织入A的所有方法。

5、代理
补充:需要添加测试包Junit4-4-4.jar 方便测试
在需要测试的方法上加上注解@Test,可直接运行当前方法
cglib-node-2.1.3.jar包是CGLIB代理包
代理分为:JDK代理和CGLIB代理
AutoProxy动态代理和CGLIB代理
AutoProxy动态代理
采用了AOP之后,容器返回的对象时代理对象。用户在使用时,由代理对象调用切面组件和目标对象的功能
a、目标对象有接口采用JDK代理,没有接口会报错
b、目标对象没有接口采用CGLIB代理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值