# Spring IoC 与 AOP
一、IoC (Inversion of Control),控制反转
获取依赖对象方式反转。
- 正转:在对象中主动控制去直接获取依赖对象。
- 反转:由容器来帮忙创建及注入依赖对象
二、AOP (Aspect Oriented Programming),面向切面编程
原理
通过动态代理的方式为程序添加统一功能,集中解决一些公共问题。
优点
- 各个步骤之间的良好隔离性使耦合性大大降低;
- 源代码无关性。扩展功能时不需对源码进行修改操作;
应用场景
- Authentication 权限
- Caching 缓存
- Context passing 内容传递
- Error handling 错误处理
- Lazy loading 懒加载
- Debugging 调试
- logging 日志
- tracing 追踪
- profiling and monitoring 记录跟踪优化
- Performance optimization 性能优化
- Persistence 持久化
- Resource pooling 资源池
- Synchronization 同步
- Transactions 事务
核心概念
横切关注点
对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
切面(aspect)
类是对物体特征的抽象,切面就是对横切关注点的抽象
连接点(joinpoint)
被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器
切入点(pointcut)
对连接点进行拦截的定义
通知(advice)
所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类
目标对象
代理的目标对象
织入(weave)
将切面应用到目标对象并导致代理对象创建的过程
引入(introduction)
在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段
Spring对AOP的支持
Spring中AOP代理由Spring的IOC容器负责生成、管理,其依赖关系也由IOC容器负责管理。
- 默认使用Java动态代理来创建AOP代理;
- 当需要代理的类不是接口的时候,Spring会切换为使用CGLIB代理;
应用 AOP
定义普通业务组件;
定义切入点,一个切入点可能横切多个业务组件;
定义增强处理,增强处理就是在AOP框架为普通业务组件织入的处理动作;