AOP面向切面配置:
1、context:component-scan:扫描包路径下的所有类注解。
<!-- 指定扫描com.sfwu15.bean包下的所有类的注解 注意:扫描包时,会扫描所有包下的子孙包 --> <context:component-scan base-package="com.sfwu15.bean"></context:component-scan>
2、aop:aspectj-autoproxy:开启aop注解的自动代理。
<!-- 开启aop注解的自动代理 --> <aop:aspectj-autoproxy/>
3、bean:配置目标对象。
<!-- 1.配置目标对象 --> <bean name="orderDao" class="com.sfwu15.dao.impl.OrderDaoImpl"></bean>
4、bean:配置通知类。
<!-- 2.配置通知类 --> <bean name="myAdvice" class="com.sfwu15.demo.MyAdvice"></bean>
5、aop:config:面向切片编程的配置。
(一)spring.xml 文件中的配置。
- aop:pointcut:配置接入点。expression 里的值是配置规则,(..)代表的是参数。
<!-- 配置切入点 以下是方法的配置规则 public void com.sfwu15.dao.impl.OrderDaoImpl.save(); void com.sfwu15.dao.impl.OrderDaoImpl.save(); * com.sfwu15.dao.impl.OrderDaoImpl.save(); * com.sfwu15.dao.impl.OrderDaoImpl.*(); * com.sfwu15.dao.impl.OrderDaoImpl.*(..); * com.sfwu15.dao.impl.*DaoImpl.*(..); --> <aop:pointcut expression="execution(* com.sfwu15.dao.impl.*DaoImpl.*(..))" id="pc"/>
- aop:aspect:配置切面。ref 里的值为面向切片编程的通知类。
- aop:after:前置方法。方法名为 before ,切点为 pc。
- aop:after-returning:后置方法。方法名为 afterReturning。
- aop:around:环绕通知。方法名为 around。
- aop:after-throwing:异常拦截通知。方法名为 afterException。
- aop:after:最终通知。方法名为 after。
<aop:aspect ref="myAdvice"> <!-- 指定名为before方法作为前置通知 --> <aop:after method="before" pointcut-ref="pc"/> <!-- 后置 --> <aop:after-returning method="afterReturning" pointcut-ref="pc"/> <!-- 环绕通知 --> <aop:around method="around" pointcut-ref="pc"/> <!-- 异常拦截通知 --> <aop:after-throwing method="afterException" pointcut-ref="pc"/> <!-- 最终通知 --> <aop:after method="after" pointcut-ref="pc"/> </aop:aspect>
xml 配置如下:
<!-- 指定扫描com.sfwu15.bean包下的所有类的注解 注意:扫描包时,会扫描所有包下的子孙包 --> <context:component-scan base-package="com.sfwu15.bean"></context:component-scan> <!-- 开启aop注解的自动代理 --> <aop:aspectj-autoproxy/> <!-- 准备工作:导入aop(约束)命名空间 --> <!-- 1.配置目标对象 --> <bean name="orderDao" class="com.sfwu15.dao.impl.OrderDaoImpl"></bean> <!-- 2.配置通知类 --> <bean name="myAdvice" class="com.sfwu15.demo.MyAdvice"></bean> <aop:config> <!-- 配置切入点 public void com.sfwu15.dao.impl.OrderDaoImpl.save(); void com.sfwu15.dao.impl.OrderDaoImpl.save(); * com.sfwu15.dao.impl.OrderDaoImpl.save(); * com.sfwu15.dao.impl.OrderDaoImpl.*(); * com.sfwu15.dao.impl.OrderDaoImpl.*(..); * com.sfwu15.dao.impl.*DaoImpl.*(..); --> <aop:pointcut expression="execution(* com.sfwu15.dao.impl.*DaoImpl.*(..))" id="pc"/> <aop:aspect ref="myAdvice"> <!-- 指定名为before方法作为前置通知 --> <aop:after method="before" pointcut-ref="pc"/> <!-- 后置 --> <aop:after-returning method="afterReturning" pointcut-ref="pc"/> <!-- 环绕通知 --> <aop:around method="around" pointcut-ref="pc"/> <!-- 异常拦截通知 --> <aop:after-throwing method="afterException" pointcut-ref="pc"/> <!-- 最终通知 --> <aop:after method="after" pointcut-ref="pc"/> </aop:aspect> </aop:config>
(二)使用注解配置。
- @Aspect:通知类,在类的上方加入注解。
@Aspect // 表示该类是一个通知类 public class MyAdvice {}
- @Pointcut:配置切入点。可将切入点配置到某一方法中。* 表示任意匹配,(..) 表示方法中带有参数。
@Pointcut("execution(* com.sfwu15.dao.impl.*DaoImpl.*(..))") public void pc(){}
- @Before:前置通知。目标方法运行之前调用。
// 前置通知 // 使用定义在方法中的切入点。 @Before("MyAdvice.pc()") public void before(){ System.out.println("这是前置通知!"); }
- @AfterReturning:后置通知。在目标方法运行之后调用,如果出现异常则不会调用。
// 后置通知 @AfterReturning("execution(* com.sfwu15.dao.impl.*DaoImpl.*(..))") public void afterReturning(){ System.out.println("这是后置通知!"); }
- @Around:环绕通知。在目标方法之前和之后都调用。
// 环绕通知 @Around("execution(* com.sfwu15.dao.impl.*DaoImpl.*(..))") public Object around(ProceedingJoinPoint pjp) throws Throwable { System.out.println("这是环绕通知之前的部分!"); Object proceed = pjp.proceed(); System.out.println("这是坏绕通知之后的部分!"); return proceed; }
- @AfterThrowing:异常通知。如果出现异常,就会调用。
// 异常通知 @AfterThrowing("execution(* com.sfwu15.dao.impl.*DaoImpl.*(..))") public void afterException(){ System.out.println("出现异常啦!"); }
- @After:最终通知。在目标方法运行之后调用(无论是否出现异常都会调用)。
// 最终通知 @After("execution(* com.sfwu15.dao.impl.*DaoImpl.*(..))") public void after(){ System.out.println("这是最终通知,出现异常也会调用!"); }
@Before 标签:配置,..,Spring,编程,通知,aop,println,面相,public From: https://www.cnblogs.com/sfwu/p/16916913.html