AOP
- 概念
- 面向切面编程 :将一批逻辑相关性的类视作一个切面,并以切面为单位,添加功能;通常用于实现具备横切性质的系统级服务。是OOP的补充。
- 应用场景: 具有横切性质的系统级服务
- 事务==>spring 声明式事务管理
- 权限验证、
- 缓存、
- 懒加载
- 全局异常处理、
- 日志追踪,
- 性能追踪(运行时间)等等
- AOP的名词
- 切面Aspect 切面编程的完整定义模块,例如日志切面,包含何时、对准、如何等内容
- 注:切面非类
- 连接点Join point 能够植入切入切面的部分,比如方法前后、抛出异常时都可以为连接点,spring支持方法连接点
- 自然会有连接点—当定义好切入点后,包含当前对象、当前方法的信息抽象为类
- JoinPoint
- ProceedingJoinPoint
- 区别:第二个比第一个多proceed()方法。
- 自然会有连接点—当定义好切入点后,包含当前对象、当前方法的信息抽象为类
- 通知 要对切面添加的功能代码,比如 安全、事务、日志等功能代码 before/after/around/after-returning/after-throwing
- 切入点Pointcut 针对那些连接点植入通知,指定具体的拦截地点。可通过SPEL指定连接点。
- 引入Introduction 对目标类添加新方法及属性
- 代理 proxy 实现AOP的原理
- 织入Weaving 把切面应用到目标对象的过程就叫织入
- 总结:
- 何时:通知—
- 何地:哪些类的那些方法 也就是切入点
- 怎么做:通知 – 配置before、通知方法(处理逻辑的类的方法)、切入点(对那些切入点)
- 这3个被包含在切面中。
- 切面Aspect 切面编程的完整定义模块,例如日志切面,包含何时、对准、如何等内容
- AOP的实现-代理
- 代理模式 Proxy模式
- 静态代理
- 动态代理
- 通过InvocationHandler 实现方法拦截并加入代理功能
- 通过Proxy类创建动态代理实例
- 当调用生成的代理实例时,被InvocationHandler方法拦截,实现方法为代理的内容。