zoukankan      html  css  js  c++  java
  • java——Spring(3)

     

     

     

     通知:

     

     aspect:把某个类作为切面类,如下,MoocAspect类即为切面类

     切入点:

     等等

    例如:

     这个表示切入点为biz包下所有后缀为“Biz”类里的所有方法;切面为MoocAspect类;

    advisor(通知):例:

     前置通知,在切面类里定义好before方法;

    在定义通知方法中,比较特殊的是arround Advice,应该该通知方法的第一个参数必需是ProceedingJoinPoint类型的,如:

     

     结果:

     其中打印出的bIz表示的则是业务类的内容,实现了环绕通知

    如果要绑定某个方法进行环绕通知,需要在配置时指定所环绕方法的参数类型与参数名称:

     且在切面类中定义环绕方法aroundInit时也需要在第一个ProceedingJoinPoint类型参数后添加相应的参数:

     这样就实现了环绕通知方法对某个具体方法的通知,且可以避免因重方法名导致的指定不一的问题

    advice各个通知的顺序:

     、

    为了给业务类提供新增的方法:

     配置如下

     types-matching:表示所对应的业务类

    implement-interface:表示所要引用的接口

    default-impl:表示所要引用接口的实例类

    测试的时候:

     这样就可以调用到FitImpl接口实现类里的方法filter()了。

    注意:

    aop:aspect与aop:advisor的区别

    实现方式不同

    < aop:aspect>定义切面时,只需要定义一般的bean就行,而定义< aop:advisor>中引用的通知时,通知必须实现Advice接口。

     

     这个就是advisor实现前通知和后通知需要继承的接口;以下是配置:

    <bean id="sleepHelper" class="com.ghs.aop.SleepHelper"></bean>
     
    <aop:config>
        <aop:pointcut expression="execution(* *.sleep(..))" id="sleepPointcut"/>
        <aop:advisor advice-ref="sleepHelper" pointcut-ref="sleepPointcut"/>
    </aop:config>
     
    <bean id="human" class="com.ghs.aop.Human"/>

    这个是正常的aspect的配置:

    <bean id="sleepHelperAspect" class="com.ghs.aop.SleepHelperAspect"></bean>
     
    <aop:config>
        <aop:pointcut expression="execution(* *.sleep(..))" id="sleepPointcut"/>
        <aop:aspect ref="sleepHelperAspect">
            <!--前置通知-->
            <aop:before method="beforeSleep" pointcut-ref="sleepPointcut"/>
            <!--后置通知-->
            <aop:after method="afterSleep" pointcut-ref="sleepPointcut"/>
        </aop:aspect>
    </aop:config>
     
    <bean id="human" class="com.ghs.aop.Human"/>

    用aspect切面类里的方法就无需继承Advice类,而只需要定义好指定的方法beforeSleep和afterSleep就好;

    使用场景不同

    < aop:advisor>大多用于事务管理。 

     例如:

    <!-- 会重复读,不会脏读事务 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="*" timeout="120" propagation="REQUIRED" rollback-for="Exception" />
        </tx:attributes>
    </tx:advice>
     
    <aop:config proxy-target-class="true">
        <aop:pointcut id="txPointCut" expression="..."/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut" />
    </aop:config>

    而< aop:aspect>大多用于日志,缓存

    AOP各种API

     

     

    ProxyFactoryBean:创建一个业务类的代理对象

     

     例子:

    在实例化业务时,class并不是对应的业务Bean,而是改成FroxyFactoryBean这个类,这个类里需要传入3个参数,分别是proxyInterfaces(业务类的父接口,target(业务类的实例化),interceptorNames(相当于代理模式时传入的管理类,即我们附加的业务类),是一个数组类型:

  • 相关阅读:
    Android组件化框架设计与实践
    浅谈Android进阶之路
    Android APP 性能优化的一些思考
    有关 Hybrid 开发模式实践总结
    开发人员必备的技能——单元测试
    有关Android插件化思考
    人生的意义到底是什么?
    Asp.Net Core 3.1学习-读取、监听json配置文件(7)
    Asp.Net Core 3.1学习-依赖注入、服务生命周期(6)
    Asp.Net Core 3.1学习- 应用程序的启动过程(5)
  • 原文地址:https://www.cnblogs.com/lzj-learn/p/12714691.html
Copyright © 2011-2022 走看看