day39-Spring 11-Spring的AOP:基于AspectJ的XML配置方式


package cn.itcast.spring3.demo2;

import org.aspectj.lang.ProceedingJoinPoint;

/**
 * 切面类
 * @author zhongzh
 *
 */
public class MyAspectXML {
     public void before(){
         System.out.println("前置通知......");
     }
     public void afterReturning(Object returnVal){
         System.out.println("后置通知......"+returnVal);
     }
     public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{//环绕通知,可以阻止目标方法的执行.
         System.out.println("环绕前增强....");
         Object result = proceedingJoinPoint.proceed();
         System.out.println("环绕后增强....");
        return result;
     }
     //异常通知
     public void afterThrowing(Throwable e){
         System.out.println("异常通知...."+e.getMessage());
     }
     //最终通知
     public void after(){
         System.out.println("最终通知.....");
     }
}
package cn.itcast.spring3.demo2;

public class ProductDao {
   //public void add(){
     public int add(){
       System.out.println("添加商品.......");
       int d = 10/0;
       return 100;
   }
   public void update(){
       System.out.println("修改商品.......");
   }
   public void delete(){
       System.out.println("删除商品.......");
   }
   public void find(){
       System.out.println("查询商品.......");
   }
}
package cn.itcast.spring3.demo2;

import org.aspectj.lang.annotation.After;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext2.xml")
public class SpringTest2 {
    @Autowired
    @Qualifier("productDao")
    private ProductDao productDao;
    
    @Test
    public void demo1(){
        productDao.add();
        productDao.find();
        productDao.update();
        productDao.delete();
    }
    
}
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引AOP的约束了,Schema里面必须是带有AOP的. -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    <!-- 自动代理是基于注解的. -->
     <!-- 定义被增强的类 -->
     <bean id="productDao" class="cn.itcast.spring3.demo2.ProductDao"></bean>
     <!-- 定义切面 -->
     <bean id="myAspectXML" class="cn.itcast.spring3.demo2.MyAspectXML"></bean>
     <!-- 定义aop配置 --><!-- 现在已经引入了AOP的名字空间 -->
     <aop:config>
         <!-- 定义切点,切点其实就是在哪些类哪些方法上应用增强 -->
         <aop:pointcut expression="execution(* cn.itcast.spring3.demo2.ProductDao.add(..))" id="mypointcut"/>
         <!-- 应用哪一个增强  advisor和aspect都是切面  advisor是一个切点和一个通知的组合 aspect是多个切点和多个通知的组合 -->
         <aop:aspect ref="myAspectXML"><!-- 定义切面 -->
               <!-- 前置通知 -->
               <aop:before method="before" pointcut-ref="mypointcut"/><!-- 前置通知 --><!-- 在哪个切点上面去应用前置通知 -->
               <!-- pointcut-ref对切点的引用,是前置的还是后置的 -->
               <!-- 后置通知  后置通知可以获取目标方法的返回值-->
               <aop:after-returning method="afterReturning" pointcut-ref="mypointcut" returning="returnVal"></aop:after-returning><!-- pointcut-ref引入切点 -->
               <!-- 环绕通知 -->
               <aop:around method="around" pointcut-ref="mypointcut"></aop:around>
               <!-- 异常通知 -->
               <aop:after-throwing method="afterThrowing" pointcut-ref="mypointcut" throwing="e"></aop:after-throwing>
               <!-- 最终通知 -->
               <aop:after method="after" pointcut-ref="mypointcut"></aop:after>
         </aop:aspect>
     </aop:config>
</beans>

 

posted on 2017-05-05 09:07  绿茵好莱坞  阅读(159)  评论(0编辑  收藏  举报

导航