面试必然会问到的经典题目;我也不说多的,就代码的使用和简单的理解,因为基本上就是这样,很多时候项目搭建的时候架构师就已经写好了。
Aop,首先是是使用场景,最经典的日志记录,然后是运行统计、事务管理、缓存优化等等。
作用就是,把代码里面的需要重复写的、耦合性比较高的、具有横向扩展的代码抽取出来,简单说就是把某些代码抽取出来独立运行。在我们的接口方法之前、或者之后走一遍切面,这样我有需求改动代码就只用改动切面类的代码就可以了。
切面组成部分,分为三个部分。切面类、切点、通知。
下图所示:
1、定义一个切面类这个就不需要多说了。加上@Aspect 和 @Component 注解就是一个切面类。
2、定义切点,@Pointcut("
(execution(* cn.hsa.pss.cw.service.*.*ServiceImpl.*(..)) || execution(* cn.hsa.pss.cw.service.*.*.*ServiceImpl.*(..))) &&!execution(* cn.hsa.pss.cw.service.impl.BusinessConfigServiceImpl.queryBusinessConfigByPKAdmdvs(..))
")
这个表达式的意思就是对这个,所有包路径下的,所有子包、所有ServiceImpl结尾的实现类、里面的所有方法和方法的所有参数作为切面目标。可以或者连接两个切点条件,也可以对具体的模块的类的方法不进行切面方法的执行。切点下的方法名可以自定义。
3.通知,这个比较重要,涉及到五个通知注解,浅浅解释一波。
1)、@Before(),在我们的接口方法执行之前,先走我们的定义好的切面通知方法,执行顺序,1.切面类的doBefore()。2.我们的自己写的接口方法。
2)、@After(),先执行我们的写的接口,执行完毕之后走切面类的的doAfter(),抛出异常或者执行完我们自己的接口方法之后执行。
3)、@AfterReturning(),和2)的区别就是在我们的接口正常执行之后走我们的通知方法。
4)、@AfterThrowing(),和2)的区别就是在我们@的接口抛出异常之后走切面里面的通知方法。
5)、@Around(),包含了前面四个通知的特点,在我们自己定义的接口之前先走一遍,环绕通知方法,相当before()。我们的接口执行完之后,再走一边环绕通知方法,相当After()。
然后我们都知道,jdk动态代理是接口的重写(适用于实现接口的类,spring aop的默认实现),实现类实现了接口。我们平常项目写接口的时候都懂。另一种就是,如果没有接口只有类就是通过Cglib来实现,cglib动态代理是类的继承。
学习总结:比较建议结合项目和百度去看,自己再跟着写一个小Demo,就会学的比较快,自己理解了,就能说出来了。也不会轻易忘记。



