Spring IoC 与 AOP
一、IoC (Inversion of Control),控制反转
获取依赖对象(Spring Bean)方式反转。
- 正转:在对象中主动控制去直接获取依赖对象。
- 反转:由容器来帮忙创建及注入依赖对象
两种不同类型容器如下:
-
Spring BeanFactory 容器
它是最简单的容器,给 DI(依赖注入) 提供了基本的支持,它用
org.springframework.beans.factory.BeanFactory
接口来定义。 -
Spring ApplicationContext 容器
该容器添加了更多的企业特定的功能,例如从一个属性文件中解析文本信息的能力,发布应用程序事件给感兴趣的事件监听器的能力。该容器是由
org.springframework.context.ApplicationContext
接口定义。
PS:ApplicationContext
容器包括 BeanFactory
容器的所有功能,所以通常ApplicationContext
作为Spring
容器。BeanFactory
仍然可以用于轻量级的应用程序,如移动设备或基于 applet 的应用程序。
二、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框架为普通业务组件织入的处理动作;
-