赞
踩
原文网址:Spring之AOP的原理(一)--概述_IT利刃出鞘的博客-CSDN博客
说明
本文介绍Spring中的AOP的原理。
相关网址
Spring之AOP的原理(二)--源码分析_IT利刃出鞘的博客-CSDN博客
原理简介
Spring AOP本质是用的代理模式(动态代理),其基于BeanPostProcessor实现,从而能够与IOC结合起来。
引入AOP的方法
如果引入的是spring-aop包,则需要使用@EnableAspectJAutoProxy开启aop功能;如果引入的是spring-boot-starter-aop,则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 中通常都习惯这样写代码:
- @Autowired
- UserService userService;
在这种情况下,无论是使用 JDK 动态代理,还是 CGLIB 都不会出现问题。
但是,如果你的代码是这样的呢:
- @Autowired
- UserServiceImpl userService;
这个时候,如果我们是使用 JDK 动态代理,那在启动时就会报错:
上边只是部分内容,为便于维护,本文已迁移到此地址:Spring之AOP的原理(一)-概述 - 自学精灵
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。