-
IOC是什么
IOC(Inversion of Control)控制反转,IOC是一种新的java编程模式, 目前很多轻量级容器都在广泛使用的模式.
-
IOC解决了什么问题?
在IOC出现以前,组件之间的协调关系都是由程序员内部代码来控制的,或者说,以前使用new关键字来实现两组间之间的依赖关系.
这中方式就造成了组件之间的相互耦合.IOC(控制反转)就是来解决这个问题的,它将实现组件间的关系从程序内部提到外部容器来管理.
也就是说, 由容器在运行期间将组件间的某种依赖关系动态的注入组件中.
-
IOC的实现方式及与DI的关系
-
依赖查找(Dependency Lookup):容器中的受控对象通过容器的API来查找自己所以来的资源和写作对象.
这种方式虽然降低了对象间的依赖,但是同时也使用到了容器的API,造就了无法在容器外使用和测试对象.
依赖查找是一种鞥家传统的ICO实现方式.
-
依赖注入(Dependency Injection):这就是DI, 字面理解, 依赖注入就是将服务注入到使用它的地方,对象只提供普通的方法,让容器去决定依赖关系,容器全权负责组件的装配,它会吧符合依赖关系的对象通过属性(JavaBean中的setter)或者是构造子传递给需要的对象.
相对于IOC而言, 依赖注入(DI)更加准确地描述了IOC的设计理念,所谓依赖注入, 即组件之间的依赖关系由容器在用用系统运行期来决定,也就是由容器动态地将某种依赖关系地目标对象实例注入到应用系统中的各个关联的组件之中.
-
-
Spring中的IOC与DI
IOC是Spring的核心,贯穿始终. 对于Spring框架来说, 就是由Spring来负责控制对象的生命周期对象间的关系.
Spring中DI有两种实现方式--setter方式(传值方式)和构造器方式(引用方式)
IOC与DI
首先说说ICO(Inversion of Control, 控制反转), 这是Spring的核心. 所谓ICO,对Spring框架来说, 就是由Spring来负责控制对象的生命周期和对象间的关系.
IOC的一个重点是在系统运行中, 动态地向某个对象提供它所需要的其他对象. 这一点是通过DI(Dependency Injection,依赖注入)来实现的. 比如对象A需要操作数据库, 以前总是要在A中编写代码来获得一个Connection对象, 有了Spring,只需告诉Spring, A中需要一个Connection,至于这个Connection怎么构造, 何时构造, A不需要知道. 在系统运行时, Spring会在适当的时候制造一个Connection, 然后像打针一样, 注射到A中, 这样就完成了对哥哥对象之间关系的控制. A需要依赖Connection才能正常运行, 而这个Connection是由Spring注入到A中的, 依赖注入的名字就这么来的. DI是如何实现? java1.3之后一个重要特征是反射(reflection), 它允许程序在运行的时候动态地声称对象,执行对象的方法,改变对象的属性,Spring就是通过反射来实现注入的.
AOP是OOP的延续,是(Aspect Oriented Programming)的缩写, 意思就是面向切面编程.
AOP(Aspect Orient Programming), 作为面向对象编程的一种补充, 广泛应用于处理一些具有横切性质的系统级服务, 如事务管理,安全检查,缓存,对象池管理等. AOP实现的关键就在于AOP框架自动创建的AOP代理, AOP代理则可分为静态代理和动态代理两大类, 其中静态代理是指使用AOP框架提供的命令进行编译, 从而便一阶段就可生成AOP代理类, 因此也称为编译时增强; 而动态代理则运行时借助于JDK动态代理,CGLIB等内存中"临时"生成AOP动态代理类, 因此也被称为运行时增强.
-
为什么需要MVC?
软件中最核心的,最基本的是数据.
所有的代码都是围绕数据的, 所以围绕数据的产生,修改等变化,出现了业务逻辑.
围绕着数据的显示, 出现了不同的界面技术. 没有很好设计的代码, 常常就会出现数据层(持久层)和业务逻辑层还有界面代码耦合的情况. ORM等框架,解耦合了业务逻辑和数据之间的耦合, 业务逻辑不再关心底层数据如何存储和读取. 所有数据呈现给业务逻辑层的就是一个个的对象. 而MVC,MVP,MMVM用来解决业务逻辑和视图之间的耦合.
-
MVC
MVC全名是Model View Controller, 是模型(model)-视图(view)-控制器(controller)的缩写, 一种软件设计典范, 用一种业务逻辑,数据,界面显示分离的方法组织代码, 将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑.其中M层处理数据,业务逻辑等; V层处理界面的显示结果;C层起到桥梁的作用,来控制V层和M层通信以此来达到分离视图显示view和业务逻辑层model.MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式.比如一批统计数据可以分别用柱状图,饼状图来表示.C存在的目的则是确保M和V的同步, 一旦M改变, V应该同步更新.
-
Model层:适合做一些业务逻辑处理, 比如数据库存储操作, 网络操作, 复杂的算法, 耗时的任务等都在model 层处理.
Model层是一个应用系统的核心部分,代表了该系统实际要实现的所有功能处理. 比如:在视频播放器中, 模型代表一个视频数据库及播放视频的程序函数代码; 在拍照应用中, 模型代表一个照片数据库, 及看图片时的程序函数代码. 在一个电话应用中, Model代表一个电话号码簿, 以及拨打电话和发送短信的程序函数代码.
Model在values目录下通过xml文件格式生成, 也可以通过硬编码的方式直接Java代码生成. View和Model是通过桥梁Adapter来连接起来.
View层:应用层中处理数据显示的部分, XML布局可以视为V层, 显示Model层的数据结果. View是软件应用传送给用户的一个反馈结果. 它代表软件应用中的图形展示,声音播放,触觉反馈等职责. 视图的根节点是应用程序的自身窗口. 比如, 视频播放器中可能包含当前播放的画面, 这个画面就是一个视图. 另一个视图组件可能是盖视频的文字标题. 字一个就是一些播放按键, 比如:Stop,Start,Pause等按钮.
Controller层:在Android中, Activity处理用户交互问题, 因此可以任务Activity是控制器, Activity读取V视图层的数据(eg.读取当前EditText控件的数据),控制用户输入(eg.EditText控件数据的输入),并向Model发送数据请求(eg.发起网络请求等). Controller在软件应用负责对外部时间的响应,包括:键盘敲击,屏幕触摸,电话呼入等. Controller实现了一个时间队列, 每一个外部时间均在事件队列中被唯一标示. 框架以此将事件从队列中移出并派发出去.
-
总而言之,MVC框架如下:
- View是应用程序中负责生成用户界面的部分. 也是整个mvc框架中用户唯一可以看到的一层, 接收用户的输入, 显示处理结果.
- Controller是根据用户的输入, 控制用户界面数据显示及更新model对象状态的部分,控制器更重要的一种导航功能,向用用户发出的相关事件, 交给Model处理.
- Model应用程序的主体部分, 所有的业务逻辑都应该写在该层.
在MVC模式, 其实控制器Activity主要是起到解耦作用, 将View视图和Model模型分离, 虽然Activity起到交互作用, 但是找到Activity中有很多关于视图UI的显示代码, 因此View视图和Activity控制器并不是完全分离的, 也就是说一部分View视图和Controller控制器Activity是绑定在一个类中的.
MVC的优点:
- 耦合性低. 所谓耦合性就是模块代码之间的关联程度. 利用MVC框架使得View(视图)层和Model(模型)层可以很好的分离, 这样就达到了解耦的目的, 所以耦合性低, 减少模块代码之间的相互影响.
- 可扩展性好, 由于耦合性低, 添加需求, 扩展代码就可以减少修改之前的代码, 降低bug的出现率.
- 模块职责划分明确, 主要华分层M,V,C三个模块, 利于代码维护.