注:希望大家看后,请给我一点评价,无论写的怎么样,希望你们能给我支持。提出你宝贵的意见。我会继续完善。谢谢您。朋友。
以下这部分是第二章后面的.
(2)IOC 是一种使应用程序逻辑外在化的设计模式
因为提供服务的组件是被注入而不是被写入到客户机代码中。将 IOC 与接口编程应用结合从而产生出 Spring 框架的架构,这种架构能够减少客户机对特定实现逻辑的依赖。
(3)IoC的设计目标
(4)IoC在应用开发中的体现
IoC的抽象概念是“依赖关系的转移”,在实际应用中的下面的各个规则其实都是IoC在应用开发中的体现。
l
“高层模块组件不应该依赖低层模块组件,而是模块组件都必须依赖于抽象”是 IoC的一种表现
l
“实现必须依赖抽象,而不是抽象依赖实现”也是IoC的一种表现
l
“应用程序不应依赖于容器,而是容器服务于应用程序”也是IoC的一种表现。
接下来我们讲在讲述它的另外的一个名字:依赖注入(DI)。
Spring 中的依赖注入(DI)
(1)DI = Dependency Injection
正在业界为IoC争吵不休时《Inversion of Control Containers and the Dependency Injection pattern》为IoC正名,至此,IoC又获得了一个新的名字:“依赖注入(Dependency Injection)”。
Dependency Injection模式是依赖注射的意思,也就是将依赖先剥离,然后在适当时候再注射进入。
(2)何谓依赖注入
相对IoC 而言,“依赖注入”的确更加准确地描述了这种古老而又时兴的设计理念。从名字上理解,所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中。
在上面的UserService中已经体现了这种方式,当UserService需要的UserLogin的时候,容器会给它注入。这就体现了需要用的时候,有容器给你注入。你不必主动的如创建了。也不用如管理它了。是不是和以前的编程方式有些改变。可能你会想到,这不就是工厂模式的衍生吗?不错它就是利用工厂模式的原理实现的,但它原比工厂模式简单。通过上面的部分代码我们就可以看出它就是工厂模式的衍生,beanfactory就充分说明了这一点。
我接下来通过讲一个比较接近生活中的例子来说名依赖注入的原理。
图解“依赖注入”(摘录网上资料)
PHP?refimg=" + this.src)" alt="" src="http://img.jb51.cc/vcimg/static/loading.png" src="http://p.blog.csdn.net/images/p_blog_csdn_net/weijie_search/spring_5.jpg">
(1)IT人员的标准“行头”
上面是我们常用的工作装备,笔记本电脑一台、USB硬盘和U盘各一只。想必大家在日常工作中也有类似的一套行头。这与依赖注入有什么关系?
(2)图解“依赖注入”---在运行时由容器将依赖关系注入到组件中
图中三个设备都有一个共同点,都支持USB 接口。当我们需要将数据复制到外围存储设备时,可以
根据情况,选择是保存在U盘还是USB硬盘,下面的操作大家也都轻车熟路,无非接通USB接口,然后在资源浏览器中将选定的文件拖放到指定的盘符。
这样的操作在过去几年中每天都在我们身边发生,而这也正是所谓依赖注入的一个典型案例,再看上例中,笔记本电脑与外围存储设备通过预先指定的一个接口(USB)相连,对于笔记本而言,只是将用户指定的数据发送到USB接口,而这些数据何去何从,则由当前接入的USB设备决定。
在USB设备加载之前,笔记本不可能预料用户将在USB接口上接入何种设备,只有USB设备接入之后,这种设备之间的依赖关系才开始形成。
对应上面关于依赖注入机制的描述,在运行时(系统开机,USB 设备加载)由容器(运行在笔记本中的Windows操作系统)将依赖关系(笔记本依赖USB设备进行数据存取)注入到组件中(Windows文件访问组件)。这就是依赖注入模式在现实世界中的一个版本。
在Spring中为什么要提供“依赖注入”设计理念
(1)目的
依赖注入的目标并非为软件系统带来更多的功能,而是为了提升组件重用的概率,并为系统搭建一个灵活、可扩展的平台。
(2)原因---更简洁的编程实现
很多初学者常常陷入"依赖注入,何用之有?"的疑惑。想来前面和下面的例子可以帮助大家简单的理解其中的含义。
回顾上面创建Spring_chap2的例子中,UserService类在运行前,其userName,passWord节点为空。运行后由容器将字符串"admin"和"1234"注入。此时UserService即与内存中的"admin"和"1234"字符串对象建立了依赖关系。也许区区一个字符串我们无法感受出依赖关系的存在。
如果把这里的userName/passWord属性换成一个数据源(DataSource),可能更有感觉:
<beans>
<bean id="dataSource" class="org.springframework.indi.Jndiobjectfactorybean">
<property name="jndiName">
连接池的配置交给容器
|
</property>
</bean>
<bean id="dataBean" class="examples.DAOBean">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
</beans>
其中DAOBean(假设DAOBean是一个运行在J2EE容器中的组件---如Weblogic或者Tomcat等)中的dataSource将由容器在运行期动态注入,而DataSource的具体配置和初始化工作也将由容器在运行期完成。
对比传统的实现方式(如通过编码初始化DataSource实例),我们可以看到,基于依赖注入的系统实现相当灵活简洁。
(3)产生的效果
通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定DAOBean中所需的DataSource实例。DAOBean只需利用容器注入的DataSource实例,完成自身的业务逻辑,而不用关心具体的资源来自何处、由谁实现。
@H_404_927@
l
提高了组件的可移植性和可重用度