T007-SpringAOP回顾、学习总结
2020-02-05 04:35:45 0 举报
AI智能生成
Spring Aop 知识点梳理
作者其他创作
大纲/内容
概念
是一种编程范式,不是编程语言
解决特定问题,不能解决所有问题
是OOP的补充,不是替代
初衷
解决代码重复
关注点分离(水平分离:展示层->服务层->持久层)
垂直分离:模块划分(订单,库存等)
切面分离:(分期功能性需求与非功能性需求)
好处
集中处理某一关注点或横切逻辑
很方便的添加或删除关注点
代码侵入性少,增加代码可读性及可维护性
使用场景
权限控制
缓存控制
事物控制
日志记录
性能监控
分布式追踪
异常处理
支持语言
Java
.Net
C/C++
Python
PHP
Ruby
编程范式
面向过程编程
面向对象编程
函数式编程
事情驱动编程
面签切面编程
Spring AOP
引入方式
spring-boot-start-aop
使用方式
XML配置
注解
切面:@Aspect
织入:@Pointcut
@Before
@After
@Around
@AfterReturning
@AfterThrowing
expression
表达式:designators
匹配方法
execution()
如:@Pointcut("execution(public * com.xx.*Service.*(..))")
如:@Pointcut("execution(public String com.xx.*Service.*(..))")
如:@Pointcut("execution(public void com.xx.*Service.*(..))")
如:@Pointcut("execution(public void com.xx.*Service.*(..)) throws XXXException")
匹配注解
@target()
如:@Pointcut("@target(com.xx.Repository)")
@args()
如:@Pointcut("@args(com.xx.Repository)")
@within()
如:@Pointcut("@within(com.xx.Beta)")
@annotation()
如:@Pointcut("@annotation(com.xx.XXAnnotation)")
匹配包或类型
within()
如:@Pointcut("within(com.xxx.ProductService)")
如:@Pointcut("within(com.xxx..*)")
匹配对象
this()
如:@Pointcut("this(com.xxx.DemoDao)")
bean()
如:@Pointcut("bean(*Service)")
target()
如:@Pointcut("target(com.xxx.DemoDao)")
匹配参数
args()
如:@Pointcut("args(Long)")
如:@Pointcut("args(Long,..)")
通配符:wildcards
*
匹配任意数据量的字符
..
一般用于匹配任意数的子包或参数
+
匹配指定类及其子类
运算符:operators
&&
并
||
或
!
取反
实现原理
概念
织入时机
编译期(AspectJ)
类加载时(Aspect 5+)
运行时(Spring AOP)
实现方式
静态代理
动态代理
基于接口代理
基于继承代理
设计
代理模式
责任链模式
实现
JDK实现
类:java.lang.reflect.Proxy
接口:InvocationHandler
只能基于接口进行动态代理
Cglib实现
类:Enhancer
接口:MethodInterceptor
基于继承实现
区别
JDK只能针对有接口的类的接口方法进行动态代理
Cglib基于继承来实现代理,无法对static,final类进行代理
Cglib基于继承实现代理,无法对private,static方法进行代理
spring实现方式
AbstractAutoProxyCreator->ProxyFactory->ProxyCreatorSupport->DefaultAopProxyFactory
如果目标对象实现了接口,则默认采用JDK动态代理
如果目前对象没有实现接口,则采用Cglib进行动态代理
如果目标对象实现了接口,且强制cglib代理,则使用cglib代理
开源应用
@Transactional 事物
@PreAuthorize 安全
@Cacheable 缓存
注意事项
不宜把重要的业务放到AOP中
无法对final、private、static方法进行拦截
无法拦截内部方法相互调用(尤其注意)
收藏
0 条评论
下一页