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>