一、基于xml的AOP配置
    aop:config:用于声明开始aop的配置
    aop:aspect:配置切面
    aop:pointcut:配置切入点表达式
    aop:before:用于配置前置通知
    aop:after-returning:用于配置后置通知

    beans.xml:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:aop="http://www.springframework.org/schema/aop"
    5. xsi:schemaLocation="http://www.springframework.org/schema/beans
    6. http://www.springframework.org/schema/beans/spring-beans.xsd
    7. http://www.springframework.org/schema/aop
    8. http://www.springframework.org/schema/aop/spring-aop.xsd">
    9. <!--配置一个目标类的实例-->
    10. <bean id="aopMethod" class="com.jy.aop.method.AopMethod"></bean>
    11. <!--配置通知类的实例-->
    12. <bean id="aopLogger" class="com.jy.aop.logger.AopLogger"></bean>
    13. <!--开始配置aop-->
    14. <aop:config>
    15. <!--
    16. 配置切面:要去引入通知类
    17. -->
    18. <aop:aspect id="aspect" ref="aopLogger">
    19. <!--
    20. 开始配置通知:
    21. pointcut:配置切入点表达式,就是设置通知的作用范围
    22. -->
    23. <!--开始配置前置通知-->
    24. <aop:before method="beforeAdvice" pointcut="execution(* com.jy.aop.method.AopMethod.*(..))"></aop:before>
    25. <!--配置后置通知-->
    26. <aop:after-returning method="afterAdvice" pointcut="execution(* com.jy.aop.method.AopMethod.*(..))"></aop:after-returning>
    27. <!--配置异常通知-->
    28. <aop:after-throwing method="exceptionAdvice" pointcut="execution(* com.jy.aop.method.AopMethod.*(..))"></aop:after-throwing>
    29. <!--配置最终通知-->
    30. <aop:after method="endAdvice" pointcut="execution(* com.jy.aop.method.AopMethod.*(..))"></aop:after>
    31. </aop:aspect>
    32. </aop:config>
    33. </beans>

    或者:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:aop="http://www.springframework.org/schema/aop"
    5. xsi:schemaLocation="http://www.springframework.org/schema/beans
    6. http://www.springframework.org/schema/beans/spring-beans.xsd
    7. http://www.springframework.org/schema/aop
    8. http://www.springframework.org/schema/aop/spring-aop.xsd">
    9. <!--配置一个目标类的实例-->
    10. <bean id="aopMethod" class="com.jy.aop.method.AopMethod"></bean>
    11. <!--配置通知类的实例-->
    12. <bean id="aopLogger" class="com.jy.aop.logger.AopLogger"></bean>
    13. <!--开始配置aop-->
    14. <aop:config>
    15. <!--
    16. 配置切面:要去引入通知类
    17. -->
    18. <aop:aspect id="aspect" ref="aopLogger">
    19. <!--声明一个切入点-->
    20. <aop:pointcut id="pt01" expression="execution(* com.jy.aop.method.AopMethod.*(..))"/>
    21. <!--
    22. 开始配置通知:
    23. pointcut:配置切入点表达式,就是设置通知的作用范围
    24. -->
    25. <!--开始配置前置通知-->
    26. <aop:before method="beforeAdvice" pointcut-ref="pt01"></aop:before>
    27. <!--配置后置通知-->
    28. <aop:after-returning method="afterAdvice" pointcut-ref="pt01"></aop:after-returning>
    29. <!--配置异常通知-->
    30. <aop:after-throwing method="exceptionAdvice" pointcut-ref="pt01"></aop:after-throwing>
    31. <!--配置最终通知-->
    32. <aop:after method="endAdvice" pointcut-ref="pt01"></aop:after>
    33. </aop:aspect>
    34. </aop:config>
    35. </beans>

    二、基于注解配置aop
    @Aspect:声明为切面类
    @Before:前置通知的注解
    @After:最终通知的注解
    @AfterReturning:后置通知的注解
    @AfterThrowing:异常通知的注解
    @Around:环绕通知的注解
    @Pointcut:切入点的注解

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:aop="http://www.springframework.org/schema/aop"
    5. xmlns:context="http://www.springframework.org/schema/context"
    6. xsi:schemaLocation="http://www.springframework.org/schema/beans
    7. http://www.springframework.org/schema/beans/spring-beans.xsd
    8. http://www.springframework.org/schema/aop
    9. http://www.springframework.org/schema/aop/spring-aop.xsd
    10. http://www.springframework.org/schema/context
    11. http://www.springframework.org/schema/context/spring-context.xsd">
    12. <!--开启spring扫描包-->
    13. <context:component-scan base-package="com.jy"></context:component-scan>
    14. <!--开启AOP注解的支持-->
    15. <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    16. </beans>
    1. /**
    2. * @author shizi 2022/2/3
    3. * 日志管理类(通知类)
    4. */
    5. @Component
    6. @Aspect
    7. public class AopLogger {
    8. /**
    9. * 声明一个切入点表达式
    10. */
    11. @Pointcut("execution(* com.jy.aop.method.AopMethod.*(..))")
    12. public void pt01(){
    13. }
    14. /**
    15. * 前置通知
    16. */
    17. @Before("pt01()")
    18. public void beforeAdvice(){
    19. System.out.println("前置通知开始记录日志了==");
    20. }
    21. /**
    22. * 后置通知
    23. */
    24. @AfterReturning("pt01()")
    25. public void afterAdvice(){
    26. System.out.println("后置通知开始记录日志了==");
    27. }
    28. /**
    29. * 异常通知
    30. */
    31. @AfterThrowing("pt01()")
    32. public void exceptionAdvice(){
    33. System.out.println("异常通知开始记录日志了");
    34. }
    35. /**
    36. * 最终通知
    37. */
    38. @After("pt01()")
    39. public void endAdvice(){
    40. System.out.println("最终通知开始记录日志了");
    41. }
    42. }

    三、环绕通知
    环绕通知是invoke方法的整个过程,所以包含了其他通知,因此基于xml配置时,只需配置环绕通知。
    基于注解的环绕通知很简单,只需在对应方法加上@Around注解.
    可以获取目标方法的 完全控制权!(方法是否执行、控制参数、控制返回值)
    在使用环绕通知时,目标方法的一切信息,都可以通过invocation(invoke方法传进去的参数名称)参数获取到
    image.png

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:aop="http://www.springframework.org/schema/aop"
    5. xsi:schemaLocation="http://www.springframework.org/schema/beans
    6. http://www.springframework.org/schema/beans/spring-beans.xsd
    7. http://www.springframework.org/schema/aop
    8. http://www.springframework.org/schema/aop/spring-aop.xsd">
    9. <!--配置一个目标类的实例-->
    10. <bean id="aopMethod" class="com.jy.aop.method.AopMethod"></bean>
    11. <!--配置通知类的实例-->
    12. <bean id="aopLogger" class="com.jy.aop.logger.AopLogger"></bean>
    13. <!--开始配置aop-->
    14. <aop:config>
    15. <!--
    16. 配置切面:要去引入通知类
    17. -->
    18. <aop:aspect id="aspect" ref="aopLogger">
    19. <!--声明一个切入点-->
    20. <aop:pointcut id="pt01" expression="execution(* com.jy.aop.method.AopMethod.*(..))"/>
    21. <!--
    22. 开始配置通知:
    23. pointcut:配置切入点表达式,就是设置通知的作用范围
    24. -->
    25. <aop:around method="aroundAdvice" pointcut-ref="pt01"></aop:around>
    26. </aop:aspect>
    27. </aop:config>
    28. </beans>
    1. /**
    2. * 环绕通知
    3. * @param proceedingJoinPoint
    4. */
    5. public void aroundAdvice(ProceedingJoinPoint proceedingJoinPoint){
    6. //获取调用目标方法时的参数
    7. Object[] args = proceedingJoinPoint.getArgs();
    8. try {
    9. System.out.println("前置通知开始记录日志了==");
    10. //调用目标方法
    11. proceedingJoinPoint.proceed(args);
    12. System.out.println("后置通知开始记录日志了==");
    13. } catch (Throwable throwable) {
    14. System.out.println("异常通知开始记录日志了");
    15. throwable.printStackTrace();
    16. }finally {
    17. System.out.println("最终通知开始记录日志了");
    18. }
    19. }