zoukankan      html  css  js  c++  java
  • Spring框架的AOP

    xml配置AOP的步骤:

    1,准备了一个实现接口的bean, 还有一个事务的碎片化方法的类;
     2,把这两个类配置到Spring容器中;
     3,配置springAOP
      1)引入aop命名空间;
      2)配置AOP,格式如下
      <aop:config>
          <aop:point-cut expression=""  id="sample" />
          <aop:aspect ref="">
               <aop:before method="" pointcut-ref="sample">
               <aop:after-returning method="" pointcut-ref="sample">
               <aop:after-throwing method="" pointcut-ref="sample">
          </aop:aspect>
      </aop:config>
          1] aop:config: AOP配置
          2] aop:point-cut: AOP切入点
          3] aop:aspect: AOP切面配置
          4] aop:* 都是一个AOP切面

     4,在接口文件中配置一个业务逻辑对象的接口,DI注入,并在test方法中直接调用该接口的具体业务逻辑

     配置AOP的几种方法:

    1、最繁琐的:

     1 <aop:config>
     2         <!--配置一堆切面 -->
     3         <aop:aspect ref="tram">
     4             <!--开始事务 -->
     5             <aop:before method="begin" pointcut="execution(* com.gxxy.spring.aop.kp03_xml.*.*(..))"/>
     6             <!--提交事务 -->
     7             <aop:after-returning method="commit" pointcut="execution(* com.gxxy.spring.aop.kp03_xml.*.*(..))"/>
     8             <!--处理异常 -->
     9             <aop:after-throwing method="rollback" pointcut="execution(* com.gxxy.spring.aop.kp03_xml.*.*(..))"/>
    10             <!--finally必须输出的 -->
    11             <aop:after method="hishfied" pointcut="execution(* com.gxxy.spring.aop.kp03_xml.*.*(..))"/>
    12         </aop:aspect>
    13     </aop:config>

    2、简化的:

     1 <aop:config>
     2         <!-- 配置AOP的切入点 -->
     3         <aop:pointcut expression="execution(* com.gxxy.spring.aop.kp03_xml.*.*(..))" id="all"/>
     4         <aop:aspect ref="tram">
     5             <aop:before method="begin" pointcut-ref="all"/>
     6             <aop:after-returning method="commit" pointcut-ref="all"/>
     7             <aop:after-throwing method="rollback" pointcut-ref="all"/>
     8             <aop:after method="hishfied" pointcut-ref="all"/>
     9         </aop:aspect>
    10     </aop:config>

    注意:前面的两种在xml里面配置还需要两个bean:

    1 <!-- 配置service的类,也就是实现接口的类,DAO层 -->
    2     <bean id="service" class="com.gxxy.spring.aop.kp03_xml.StudentImpl"></bean>
    3     <!-- 配置AOP的那个类 -->
    4     <bean id="tram" class="com.gxxy.spring.aop.kp03_xml.TransationManager"></bean>

    3、直接使用注解的:在代理类里面

     1 package com.gxxy.spring.aop.kp04_annotion;
     2 
     3 import org.aspectj.lang.annotation.After;
     4 import org.aspectj.lang.annotation.AfterReturning;
     5 import org.aspectj.lang.annotation.AfterThrowing;
     6 import org.aspectj.lang.annotation.Aspect;
     7 import org.aspectj.lang.annotation.Before;
     8 import org.aspectj.lang.annotation.Pointcut;
     9 import org.springframework.stereotype.Component;
    10 
    11 @Aspect
    12 //相当于<aop:aspect ref="tram">
    13 @Component
    14 //IoC
    15 public class TransationManager {
    16     //<aop:pointcut expression="execution(* com.gxxy.spring.aop.kp03_xml.*.*(..))" id="all"/>
    17     @Pointcut("execution(* com.gxxy.spring.aop.kp04_annotion.*.*(..))")
    18     public void service(){};
    19     //@Before("execution(* com.gxxy.spring.aop.kp03_xml.*.*(..))")
    20     @Before("service()")
    21     public void begin(){
    22         System.out.println("TransationManager.begin()");
    23     }
    24     @AfterReturning("service()")
    25     public void commit(){
    26         System.out.println("TransationManager.commit()");
    27     }
    28     @AfterThrowing("service()")
    29     public void rollback(){
    30         System.out.println("TransationManager.rollback()");
    31     }
    32     @After("service()")
    33     public void hishfied(){
    34         System.out.println("TransationManager.hishfied()");
    35     }
    36 }

    注意:Pointcut is not well-formed: expecting 'name pattern' at character position
     

    配置aop报错:原因是配置切点表达式的时候报错了,

    星号后面没有加空格:

    <aop:config>

    <aop:pointcut id="transactionPointcut" expression="execution(* project.mybatis.service.*.*(..))" />
    <aop:advisor pointcut-ref="transactionPointcut" advice-ref="omsMTransactionAdvice" />
    </aop:config>

    其中,切入点表达式的使用规则:

     1、execution(): 表达式主体。

     2、第一个*号:表示返回类型,*号表示所有的类型。

     3、包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,com.sample.service.impl包、子孙包下所有类的方法。

     4、第二个*号:表示类名,*号表示所有的类。

     5、*(..):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数。

  • 相关阅读:
    C字符串和C++中string的区别 &amp;&amp;&amp;&amp;C++中int型与string型互相转换
    UML的类图关系分为: 关联、聚合/组合、依赖、泛化(继承)
    STL map详细用法和make_pair函数
    字符串旋转(str.find()---KMP)
    层次遍历二叉树
    图像特征提取三大法宝:HOG特征,LBP特征,Haar特征
    位运算---整数间的转化
    最大公倍数
    单链表的实现
    jsp下Kindeditor环境搭建
  • 原文地址:https://www.cnblogs.com/nice6/p/6636938.html
Copyright © 2011-2022 走看看