Spring 配置AOP Spring注解配置AOP Spring XML 配置AOP Spring Aspect AOP

Bertha 。 2022-10-17 10:59 222阅读 0赞

一、前言

  1. Spring的特性之一AOP,老生常谈的问题,今天来记录下,Spring 框架中如何配置AOP的问题,注意下哈,非Spring Boot哈; 同时本文以 AOP切面中的表达式 @annotation 为准,还有其他多种类型,请自行了解。

二、依赖pom 和 基础配置

  1. 1Sping Aspect
  2. <dependency>
  3. <groupId>org.springframework</groupId>
  4. <artifactId>spring-webmvc</artifactId>
  5. <version>4.3.20.RELEASE</version>
  6. </dependency>
  7. <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
  8. <dependency>
  9. <groupId>org.aspectj</groupId>
  10. <artifactId>aspectjweaver</artifactId>
  11. <version>1.9.0</version>
  12. </dependency>
  13. <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
  14. <dependency>
  15. <groupId>org.aspectj</groupId>
  16. <artifactId>aspectjweaver</artifactId>
  17. <version>1.9.0</version>
  18. </dependency>
  19. 2springmvc.xml 中增加文件头
  20. xmlns:aop="http://www.springframework.org/schema/aop"
  21. xsi:schemaLocation="http://www.springframework.org/schema/aop
  22. http://www.springframework.org/schema/aop/spring-aop.xsd"

三、AOP xml形式配置

  1. 1、创建 Log注解
  2. /**
  3. * description: Log 注解
  4. * @version v1.0
  5. * @author w
  6. * @date 2021年5月12日上午9:45:15
  7. **/
  8. @Target(value = { ElementType.METHOD })
  9. @Retention(value = RetentionPolicy.RUNTIME)
  10. @Inherited
  11. @Documented
  12. public @interface Log {
  13. String name() default "";
  14. }
  15. 2、创建 LogAspect 类, 配置相关切点和增加方法
  16. import org.aspectj.lang.ProceedingJoinPoint;
  17. import org.aspectj.lang.Signature;
  18. import org.aspectj.lang.reflect.MethodSignature;
  19. import org.springframework.stereotype.Component;
  20. /**
  21. * description: AOP xml形式配置
  22. * @version v1.0
  23. * @author w
  24. * @date 2021年5月12日上午9:47:04
  25. **/
  26. @Component
  27. public class LogAspect {
  28. /**
  29. * description: 切点
  30. * @return void
  31. * @version v1.0
  32. * @author w
  33. * @date 2021年5月12日 上午9:47:52
  34. */
  35. public void pointCut() {
  36. }
  37. public Object arounds(ProceedingJoinPoint joinPoint) {
  38. Signature signature = joinPoint.getSignature();
  39. MethodSignature methodSignature = (MethodSignature)signature;
  40. Log log = methodSignature.getMethod().getAnnotation(Log.class);
  41. // 方法执行前
  42. System.out.println("开始日志记录:" + log.name());
  43. // 方法执行
  44. try {
  45. return joinPoint.proceed();
  46. } catch (Throwable e) {
  47. return e ;
  48. }finally {
  49. // 方法执行后
  50. System.out.println("日志记录执行完毕 ===== ");
  51. }
  52. }
  53. }
  54. 3springmvc.xml 中配置AOP 使用
  55. <!-- 配置AOP xml 形式 -->
  56. <aop:config>
  57. <aop:pointcut expression="@annotation(com.runcode.aspect.Log)" id="point"/>
  58. <aop:aspect ref="logAspect" order="10">
  59. <aop:around method="arounds" pointcut-ref="point"/>
  60. </aop:aspect>
  61. </aop:config>
  62. <!-- 配置AOP xml end -->
  63. 4、创建 AspectController
  64. @Log(name="web层")
  65. @RequestMapping(value= "/aspectController")
  66. @ResponseBody
  67. public String test(String name) {
  68. System.out.println("AspectController : "+ name);
  69. return "AspectController : "+ name;
  70. }
  71. 5、请求测试,查看控制台输出值情况; 方法得到增强,AOP 成功
  72. 开始日志记录:web
  73. AspectController : null
  74. 日志记录执行完毕 =====

四、AOP 注解形式配置

  1. 1、创建 LogAnon 注解
  2. /**
  3. * description: LogAnon 注解
  4. * @version v1.0
  5. * @author w
  6. * @date 2021年5月12日上午9:45:15
  7. **/
  8. @Target(value = { ElementType.METHOD })
  9. @Retention(value = RetentionPolicy.RUNTIME)
  10. @Inherited
  11. @Documented
  12. public @interface LogAnon {
  13. String name() default "";
  14. }
  15. 2、创建 LogAspectAnon 类,使用注解形式配置切点和增强方法
  16. import org.aspectj.lang.ProceedingJoinPoint;
  17. import org.aspectj.lang.Signature;
  18. import org.aspectj.lang.annotation.Around;
  19. import org.aspectj.lang.annotation.Aspect;
  20. import org.aspectj.lang.annotation.Pointcut;
  21. import org.aspectj.lang.reflect.MethodSignature;
  22. import org.springframework.core.annotation.Order;
  23. import org.springframework.stereotype.Component;
  24. /**
  25. * description: AOP 注解形式配置
  26. * @version v1.0
  27. * @author w
  28. * @date 2021年5月12日上午10:07:24
  29. **/
  30. @Aspect
  31. @Component
  32. // 有多个AOP配置,可使用order来确定执行顺序
  33. @Order(value = 1)
  34. // 可以在xml配置文件中,去掉 <aop:aspectj-autoproxy/> 标签,使用 该注解
  35. // @EnableAspectJAutoProxy
  36. public class LogAspectAnon {
  37. /**
  38. * description: 配置切点
  39. * @return void
  40. * @version v1.0
  41. * @author w
  42. * @date 2021年5月12日 上午10:15:20
  43. */
  44. @Pointcut(value = "@annotation(com.runcode.aspect.LogAnon)")
  45. public void pointCuts() {
  46. }
  47. @Around(value = "pointCuts()")
  48. public Object arounds(ProceedingJoinPoint joinPoint) {
  49. Signature signature = joinPoint.getSignature();
  50. MethodSignature methodSignature = (MethodSignature)signature;
  51. LogAnon log = methodSignature.getMethod().getAnnotation(LogAnon.class);
  52. // 方法执行前
  53. System.out.println("【注解】开始日志记录:" + log.name());
  54. // 方法执行
  55. try {
  56. return joinPoint.proceed();
  57. } catch (Throwable e) {
  58. return e ;
  59. }finally {
  60. // 方法执行后
  61. System.out.println("【注解】日志记录执行完毕 ===== ");
  62. }
  63. }
  64. }
  65. 3springmvc.xml 中配置 AOP **启用注解**形式实现 (没错,就一行代码)
  66. <!-- 配置AOP 注解形式 -->
  67. <!-- 在类上面使用 @EnableAspectJAutoProxy 注解,可以去掉该标签配置 -->
  68. <aop:aspectj-autoproxy/>
  69. 4、使用 AspectController 进行测试
  70. @LogAnon(name = "web层 注解")
  71. @RequestMapping(value= "/aspectController")
  72. @ResponseBody
  73. public String test(String name) {
  74. System.out.println("AspectController : "+ name);
  75. return "AspectController : "+ name;
  76. }
  77. 5、请求测试,查看控制台输出值情况; 方法得到增强,AOP 成功
  78. 【注解】开始日志记录:web 注解
  79. AspectController : null
  80. 【注解】日志记录执行完毕 =====

五、总结

  1. 1、本文简单的记录了,Spring 实现AOP的过程;基于注解的形式实现。([Spring 切点][Spring])
  2. 2、若使用注解的形式实现AOP,且在传统SSM项目中,需要分别在 spring.xml springmvc.xml 配置文件中,启用注解([spring springMVC的容器问题][spring _ springMVC]) 使用配置文件形式,则不需要区分。
  3. 3、在Spring Boot项目中,使用注解实现AOP,不需要启用注解的步骤。

发表评论

表情:
评论列表 (有 0 条评论,222人围观)

还没有评论,来说两句吧...

相关阅读