1.常规方式实现实例化
1.1已有角色如下:
一个接口Interface,两个接口实现类InstatnceA、InstanceB,一个调用类User
1.2当前实例化InstanceA如下:
Interface interface = new InstanceA(); #User类中的实例化代码
1.3欲修改如下:
现在想把实例化对象改为InstatnceB而不要实例化InstanceA
1.4代码修改如下:
Interface interface = new InstanceB(); #修改后的User类中的实例化代码,由InstanceA修改为了InstanceB
1.5总结:
User控制实例化哪个类(是实例化InstanceA还是InstanceB);当我们想修改实例化的类时必须去修改User中的代码。
2,.控制反转实现实例化
2.1已有角色如下:
一个接口Interface,两个接口实现类InstatnceA、InstanceB,一个调用类User,还有一个bean.xml(其维护一个Instance的id与InstanceA和InstanceB的对应关系)
2.2当前实例化InstanceA如下:
Interface interface = new Instance(); #User类中的实例化代码
<bean id="Instance" class="com.test.core.InstanceA"></bean> #bean中的映射关系
2.3欲修改如下(和1.3一样):
现在想把实例化对象改为InstatnceB而不要实例化InstanceA
2.4代码修改如下:
Interface interface = Instance(); #User类中的实例化代码,并不需要修改
<bean id="Instance" class="com.test.core.InstanceB"></bean> #对应关系为Instance--InstanceA变更为instance--InstanceB
2.5总结
spring控制实例化哪个类(是实例化InstanceA还是InstanceB);当我们想修改实例化的类时只要去修改bean.xml中的映射关系,而不用去User修改代码
3.依赖注入
User要实例化一个对像就需要一个类(InstatnceA或InstanceB)这就是一种依赖,控制反转后真正依赖的类(即要实例化的类)由beans.xml注入到User类。
依赖注入就是控制反转的别名,依赖注入侧重描述目地控制反转侧重描述现像(所以有时会见到依赖注入比控制反转给为准确的说法)。
4. MVC、IOC和ORM
SSH框架是Java Web的基石,而其中Struts核心概念是MVC、Spring的核心概念是IOC和Hibernate的核心概念是ORM,围绕这六个(或者叫三个)名词诞生了一本又一本让人看到想放弃的Java Web书藉。
其实抛开配置等细节问题仅从思想角度来看,MVC、IOC和ORM就是一回事,其本质都是将原本的“A调用B”模式解耦为“A通过xml调用B”的模式,以降低A和B强耦合导致的牵一发而动全身的问题(就是A或B修改后,工程中所有B或A的代码都要修改)。
另外,SSH可能会死(被别的框架取代),但是MVC、IOC和ORM永远不会死;但又反过来说到别的框架上MVC、IOC和ORM道理还是一样的不过换个xml文件罢了。
框架 | 核心概念 | A | xml | B | xml作用 |
Struts | MVC | 前端web页面 | struts.xml | 后端表单处理类 | struts.xml控制了前端页面实际会被推送到的类,当A/B有修改一般对此xml稍作调整即可 |
Spring | IOC | new class的代码 | beam.xml | class本身 | beam.xml控制了new class会真正被实例化的类,当A/B有修改一般对此xml稍作调整即可 |
Hibernate | ORM | 类 | table.hbm.xml | 数据库表 | table.hbm.xml控制了类属性与数据表的列的对应关系,当A/B有修改一般对此xml稍作调整即可 |
参考: