栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringDay03Aop面向切面程序

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringDay03Aop面向切面程序

【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先练习起来。

        

        

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/439450.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号