IOC / AOP

IOC/AOP

标签(空格分隔): Springspring


什么是IoC

借助"第三方" 实现具备依赖关系的对象之间的解耦.编程

将各个对象类封装以后, 经过IoC容器来关联这些对象类, 这样对象和对象之间就经过IoC容器进行联系, 但对象和对象之间并无什么直接联系. 这样就作到了具备依赖关系的对象之间的解耦.设计模式

为什么称为控制反转

软件系统在没有引入IoC容器以前, 对象A依赖对象B, 那么对象A在实例化或者运行到某一点的时候, 就必须主动建立对象B或者使用已经建立好的对象B, 其中不论是建立仍是使用已经建立的对象B, 控制权都在咱们本身的受伤.
若是软件系统引入IoC容器以后, 对象A和对象B就失去了直接联系, 因此对象A实例化运行以后, 若是须要对象B的话, IoC容器就会主动去建立一个对象B交给对象A去使用.框架

经过对比能够看到对象A依赖对象B的过程由主动且须要咱们手动建立的过程, 变成被动且不须要咱们多加注意的过程. 将对象交给了IoC容器处理, 控制权颠倒过来, 这就是控制反转.函数

依赖注入DI

所谓依赖注入,就是由IoC容器在运行期间, 动态的将某种依赖关系注入到对象之中.
依赖注入和控制反转是从不一样的角度描述同一件事情, 就是指经过引入IoC容器, 利用依赖注入的方式, 实现对象之间的解耦.单元测试

优势

IoC生成对象的方式转为外置方式, 也就是把对象生成放在配置文件里进行定义, 这样, 当咱们更滑一个实现子类将会变的很简单, 只须要修改配置文件就能够了, 具备能够热插拔的特性.测试

可维护性比较好, 很是便于进行单元测试, 便于调试程序和诊断故障.设计

缺点

软件系统中因为引入了IoC容器, 生成对象的步骤变得复杂, 原本是二者之间的关系, 这样就变成了三者, 在刚刚使用IoC框架的时候, 会感受系统变得不太直观.代理

因为IoC容器生成对象的方式是经过反射, 在运行效率上有必定的额损耗.调试


什么是AOP

Spring AOP面向切面编程, 将日志, 事务等相对独立且重复的功能抽取出来, 利用Spring的配置文件或者注解的形式将这些功能织入进去, 提升复用性.

---


Spring IoC 如何实现


Bean工厂(com.springframework.beans.factory.BeanFactory): 是Spring框架中最核心的接口, 它提供了高级IoC的配置机制. BeanFactory使管理不一样类型的Java对象成为可能.

应用上下文(com.springframework.context.ApplicationContext):创建在BeanFactory基础之上提供了更多面向引用的功能, 它提供了国际化支持和框架事件体系, 更加易于建立实际应用.


咱们通常称BeanFactoryIoC容器, 而称ApplicationContext为应用上下文或者Spring容器.
BeanFactory是Spring框架的基础设置, 面向Spring自己; ApplicationContext面向使用Spring框架的开发者, 几乎全部的应用场合均可以直接使用ApplicationContext .

Spring框架是工厂, 而被建立的类对象自己也多是一个工厂, 这就造成了建立工厂的工厂.


Spring AOP

有了IOC其中CGLIB解决了静态代理和动态代理对类的接口的依赖性和功能依赖性的问题以后, 使得将全部类(非final修饰的类)都实现代理模式成为可能(CHLIB是基于继承的方式作的动态代理). 因此IOC是AOP的基础.

面向切面编程, 在咱们的应用中, 常常须要作一些事情, 可是这些事情与核心业务无关, 好比要记录全部update的执行时间, 操做人信息等等 到日志. 经过 AOP就能够在不修改原有代码的状况下完成需求.

AOP思想: 基于动态代理把各个事务单独抽取出来, 而后经过配置去寻找他的前置,后置,异常等方法.

实际上就是经过 [动态代理设计模式][1]的动态代理方法, 使用 InvocationHandler传入类加载器和实现的接口 以 获取代理运行的被代理类的函数的方法名和传入的参数, 而后经过反射建立被代理类完成其功能, 并在其前和其后加入其它功能.

JDK动态代理类和委托类须要实现同一个接口, 也就是说只有实现了某个接口的类可使用Java动态代理机制. 可是, 事实上使用中并非遇到的全部类都会有实现接口. 所以, 对于没有实现接口的类, 就不能使用该机制. CGLIB则能够实现对类的动态代理.

相关文章
相关标签/搜索