当前位置:   article > 正文

Spring之AOP的原理(一)--概述_aspectjweaver 原理

aspectjweaver 原理

原文网址:Spring之AOP的原理(一)--概述_IT利刃出鞘的博客-CSDN博客

简介

说明

本文介绍Spring中的AOP的原理。

相关网址

Spring之AOP的原理(二)--源码分析_IT利刃出鞘的博客-CSDN博客

原理概述

原理简介

Spring AOP本质是用的代理模式动态代理),其基于BeanPostProcessor实现,从而能够与IOC结合起来。

引入AOP的方法

如果引入的是spring-aop包,则需要使用@EnableAspectJAutoProxy开启aop功能;如果引入的是spring-boot-starter-aop,则AOP就直接可以用了,无需加注解之类的开启它。 

  • spring-boot-starter-aop  (此包里包含了spring-aop与aspectjweaver)
    • spring-aop:AOP核心功能,例如代理工厂等等
    • aspectjweaver:支持切入点表达式、aop相关注解等。(本依赖包含aspectjrt)
      • aspectjrt:支持aop相关注解等。

AOP的启用

导入包即可,默认开启:spring.aop.auto=true  //等价于@EnableAspectJAutoProxy

JDK代理与CGLIB代理

SpringBoot 1.5.x:默认使用JDK代理,即:spring.aop.proxy-target-class=false  若设置为true,则使用CGLIB动态代理。
SpringBoot 2.x:默认使用CGLIB代理,即:spring.aop.proxy-target-class=true。

对应的自动配置类为:org.springframework.boot.autoconfigure.aop.AopAutoConfiguration

为什么SpringBoot 2.x:默认使用CGLIB代理?

见spring的issue:Use @EnableTransactionManagement(proxyTargetClass = true) · Issue #5423 · spring-projects/spring-boot · GitHub

即:我们应该使用@EnableTransactionManagement(proxyTargetClass = true)来防止人们不使用接口时出现讨厌的代理问题。

讨厌的代理问题

假设,我们有一个UserServiceImpl和UserService类,此时需要在UserContoller中使用UserService。在 Spring 中通常都习惯这样写代码:

  1. @Autowired
  2. UserService userService;

在这种情况下,无论是使用 JDK 动态代理,还是 CGLIB 都不会出现问题。

但是,如果你的代码是这样的呢:

  1. @Autowired
  2. UserServiceImpl userService;

这个时候,如果我们是使用 JDK 动态代理,那在启动时就会报错:

上边只是部分内容,为便于维护,本文已迁移到此地址:Spring之AOP的原理(一)-概述 - 自学精灵

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/769205
推荐阅读
相关标签
  

闽ICP备14008679号