【1】Aop(Aspect Oriented Programming)面向切面编程,基层原理就是利用动态代理的方法
【2】动态代理有基于接口的代理,有基于子类的动态代理。动态代理中被代理的对象中的党法就是切面的连接点,而切入点就是我们使用动态代理对被代理对象中的方法增强之后的方法。所有方法都可以看作是连接点,但是只有被增强过的方法才是切入点。
【3】在Spring中,动态代理的方法都已经被Spring框架解决了,我们来学习下它怎么用。
【4】首先Spring中的AOP也是提供了xml配置的方法和注解方法
【5】Aop的xml配置方法
首先我们需要配置Aop切面,要利用到标签
在aop:config标签中使用aop:pointCut标签,配置切入点表达式,就是我们需要把我们需要增强的方法告诉Spring,在哪里
切入点表达式的写法有很多,正规写法是
public void com.itheima.service.impl.AccountServiceImpl.saveAccount()
然而这只能指定一个切入点,如果我们需要把一个类中的所有方法都变成切入点,那么需要用到通配符*
首先public修饰符可以不写
其次void类型也可以变成*
包名,是有一个包,就写一个*. 注意有一个点
*..可以代替当前包以及其子包
方法名和类名也可以写成*
然后是参数,如果只有一个参数,那么括号中可以写一个*,但是一定要保证接口方法中也有参数,否则不写
如果想让参数即可能有值,也可能没值那么就用(..)代替
所以全通配的写法(这里是根据上面的例子写的):* *..*.*(..)
然后我们就可以配置aop:aspect标签了,这里面有一个ref属性,我们写的是需要对方法进行怎么样的增强的类,也就是增强的代码,都写在了一个类中,这里传入即可。
注意:切入点配置,如果配置在aspect里面。那么只能当前aspect调用
如果配置到aspect外面,就一定要配置到最上面,这样就可以所有aspect调用
aop:before是在原有方法之前执行
aop:after-returning是在原有方法时候执行
aop:after-throwing是在方法异常的时候执行
aop:after是无论方法正常执行还是不正常执行,在最后都会执行。
其中的method属性,就是我们增强方法的名字,一定要对应起来
最后还有一个aop:around,这个是环绕通知,可以根据用户自己的需求在增强方法层进行手动配置。
环绕通知
1问题:配置了环绕通知之后,切入点方法没有执行,而是通知方法执行了
2分析:通过对比动态代理,中的环绕通知代码,发现动态代理环绕有明确的切入点方法调用,而Spring没有
3解决:Spring框架为我们提供了一个接口,ProceedingJoinPoint,该接口有一个方法proceed(),此方法就相当于明确调用切入点的方法.
4该接口可以作为环绕通知的方法参数,在程序执行时,spring框架会为我们提供该接口的实现类使用
5spring中的环绕通知,是Spring框架为我们提供一种在代码中增强方法何时执行的方式,和xml配置是对立的
因为注解方式的AOP会出一点顺序的问题,所以这里就不展示了,大家学会xml先练习起来。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)