基于注解的 AOP 配置

Posted jock766

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于注解的 AOP 配置相关的知识,希望对你有一定的参考价值。

第一步:在 spring 配置文件中开启 spring 对注解 AOP 的支持

  <!-- 开启 spring 对注解 AOP 的支持 --> 
  <aop:aspectj-autoproxy> <aop:aspectj-autoproxy />  

第二步:在配置文件中指定 spring 要扫描的包

  <!-- 告知 spring,在创建容器时要扫描的包 --> 
  <context:component-scan base-package="com.itheima"></context:component-scan>

第三步:把通知类也使用注解配置

/** 
 * 事务控制类  
 * @author  
 * @Company 
 */ 
  @Component("txManager") 
  public class TransactionManager { 
   //定义一个 DBAssit  
  @Autowired  
  private DBAssit dbAssit ;  
 } 

第四步:在通知类上使用@Aspect 注解声明为切面

第五步:在增强的方法上使用注解配置通知

第六步:在增强的方法上使用注解配置通知

  @Before 
   作用:   把当前方法看成是前置通知。  
   属性:   value:用于指定切入点表达式,还可以指定切入点表达式的引用。

   //开启事务  
   @Before("execution(* com.itheima.service.impl.*.*(..))")  
   public void beginTransaction() {   
        try {    
              dbAssit.getCurrentConnection().setAutoCommit(false);   
        } catch (SQLException e) {    
              e.printStackTrace();   
        }  
  }
  
  说明:@AfterReturning 、@AfterThrowing 、@After 运用方式同理


  @Around 
        作用:  把当前方法看成是环绕通知。 
        属性:  
              value:用于指定切入点表达式,还可以指定切入点表达式的引用。 

   /** 
    * 环绕通知   
    * @param pjp   
    * @return   
    */ 
   @Around("execution(* com.itheima.service.impl.*.*(..))")  
   public Object transactionAround(ProceedingJoinPoint pjp) { 
        //定义返回值   Object rtValue = null;   
        try { 
           //获取方法执行所需的参数    
           Object[] args = pjp.getArgs(); 
           
           //前置通知:开启事务    
           beginTransaction(); 
           
           //执行方法    
           rtValue = pjp.proceed(args); 
          //后置通知:提交事务    
              commit();   
          }catch(Throwable e) { 
           //异常通知:回滚事务    
            rollback();    
            e.printStackTrace();   
         }finally {    
         //最终通知:释放资源    
              release();   
         }   
         return rtValue;  
        } 

第七步:切入点表达式注解

  @Pointcut 
        作用:  指定切入点表达式 属性: 
        value:指定表达式的内容

   @Pointcut("execution(* com.itheima.service.impl.*.*(..))")
   private void pt1() {} 

  引用方式:  
  
  /** 
   * 环绕通知   
   * @param pjp   
   * @return   
   */ 
   @Around("pt1()")//注意:千万别忘了写括号  
  public Object transactionAround(ProceedingJoinPoint pjp) {   
        //定义返回值   
        Object rtValue = null;   
        try { 
           //获取方法执行所需的参数    
              Object[] args = pjp.getArgs(); 
           //前置通知:开启事务    
              beginTransaction(); 
           //执行方法    
              rtValue = pjp.proceed(args); 
           //后置通知:提交事务    
              commit();   
        }catch(Throwable e) { 
           //异常通知:回滚事务    
              rollback();    
              e.printStackTrace();   
        }finally {    
           //最终通知:释放资源    
           release();   
        }   
           return rtValue;  
         }

第八步:不使用 XML的配置方

        @Configuration 
        @ComponentScan(basePackages="com.itheima") 
        @EnableAspectJAutoProxy 
        public class SpringConfiguration { }

以上是关于基于注解的 AOP 配置的主要内容,如果未能解决你的问题,请参考以下文章

基于注解的Spring AOP的配置和使用

阶段3 2.Spring_08.面向切面编程 AOP_9 spring基于注解的AOP配置

基于注解的Spring AOP的配置和使用--转载

基于注解的Spring AOP的配置和使用--转载

基于注解的Spring AOP的配置和使用--转载

基于注解的 AOP 配置