Spring(六)AOP-面向切面编程
一、AOP介绍

相关术语说明: ![]()
二、准备
1、需要引入的jar包

2、applicationContext.xml中需要配置
引入aop约束:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> </beans>
三、五种通知类型

举例:
首先是 .xml 文件:
.xml文件需要加入: <bean id="man" class="com.icss.controller.Man"></bean> <bean id="fbi" class="com.icss.controller.FBI"></bean> <aop:config> <!--切入点(这里是 Man类中的 )--> <!-- <aop:pointcut id = "poincut1" expression = "execution(* com.icss.controller.Man.qq(..))"/>--> <aop:pointcut id = "pointcut1" expression = "execution(* com.icss.controller.Man.qq(..))"/> <aop:pointcut id = "pointcut2" expression = "execution(* com.icss.controller.Man.mm(..))"/> <aop:pointcut id = "pointcut4" expression = "execution(* com.icss.controller.Man.errfinal(..))"/> <!--<aop:pointcut id = "pointcut3" expression = "execution(* com.icss.controller.Man.err(..))"/>--> <aop:aspect ref = "fbi"> <!--这里是 FBI类中的--> <!--前置通知--> <aop:before method = "monitoring" pointcut-ref="pointcut1"></aop:before> <!--后置通知--> <aop:after-returning method="monitoringStop" pointcut-ref="pointcut1"></aop:after-returning> <!--环绕通知--> <aop:around method = "testArround" pointcut-ref = "pointcut2"></aop:around> <!--异常通知--> <!--<aop:after-throwing method="testThrowing" pointcut-ref="pointcut3" throwing="err"></aop:after-throwing>--> <!--最终通知 :无论是否有异常 总会将方法执行完毕--> <aop:after method="testAfter" pointcut-ref="pointcut4" ></aop:after> </aop:aspect> </aop:config>
注:这里的qq(...)是一个方法,下面的*(..)代表所有的方法。
public class FBI { public void monitoring(JoinPoint joinPoint){ System.out.println("查看到某人正在" + joinPoint.getSignature().getName() + "活动"); } public void monitoringStop(JoinPoint joinPoint) { System.out.println("查看到某人停止" + joinPoint.getSignature().getName() + "活动"); } public void testArround(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("不准动!"); joinPoint.proceed(); } public void testThrowing(Object err) { System.out.println("抛出的异常是:" + err); } public void testAfter() { System.out.println("计算完毕"); } }
public class Man { public void qq() { System.out.println("男人正在聊QQ"); } public void mm() { System.out.println("男人正在泡..."); } // public void err() { // System.out.println("做算术:"); // System.out.println(10/0); // System.out.println("计算完毕"); // } public void errfinal() { System.out.println("做算术"); System.out.println(10/0); } }
四、注解方式

举例:
.xml文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <bean id="man" class="com.icss.controller.Man"></bean> <bean id="fbi" class="com.icss.controller.FBI"></bean> <aop:aspectj-autoproxy></aop:aspectj-autoproxy> </beans>
FBI类:
@Aspect //声明切面 public class FBI { //代理对象 @Before("execution(* com.icss.controller.Man.qq())") public void monitoring(JoinPoint joinPoint){ System.out.println("查看到某人正在" + joinPoint.getSignature().getName() + "活动"); } // @AfterReturning("execution(* com.icss.controller.Man.qq())") public void monitoringStop(JoinPoint joinPoint) { System.out.println("查看到某人停止" + joinPoint.getSignature().getName() + "活动"); } // @Around("execution(* com.icss.controller.Man.qq())") public void testArround(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("不准动!"); joinPoint.proceed(); } // @AfterThrowing(value = "execution(* com.icss.controller.Man.qq())", throwing = "err") public void testThrowing(Object err) { System.out.println("抛出的异常是:" + err); } // @After(value = "execution(* com.icss.controller.Man.qq())") public void testAfter() { System.out.println("计算完毕"); } }

浙公网安备 33010602011771号