300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 控制反转---依赖注入理解

控制反转---依赖注入理解

时间:2018-07-14 04:39:26

相关推荐

控制反转---依赖注入理解

在学习Spring的时候,意外找到这个控制反转(IoC)和面向切面(AOP)的容器框架之前,我们先来看一下什么是控制反转(IoC)。

控制反转(Ioc)和依赖注入(DI)刚听到感到很难理解,平时也程序也很少想到这一点,这几天学Spring的相关资料是看到的最多的是这个概念,网上放狗搜了一下,内容挺多。总算明白了一些。

Ioc,照我的理解应该是为了满足高内聚低耦合的设计原则,将对象的创建和获取交给外部容器来控制,从外部容器的角度(第三方参照物)来看,达到程序控制权的转移,这样估计好理解了。

DI,依赖注入,从字面的意思来说是从外部导入的方式实现低耦合,比如构造函数、属性设置等。

控制反转(Inversion of Control,英文缩写为IoC),也叫依赖注入(Dependency Injection)。我个人认为控制反转的意思是依赖对象发生改变,由最初的类本身来管理依赖对象改变为IoC框架来管理这些对象,使得依赖脱离类本身的控制,从而实现松耦合。

我们先来看一段代码

namespace Dao{public interface IPersonDao{void Save();}public class PersonDao : IPersonDao{public void Save(){Console.WriteLine("保存 Person");}}}namespace SpringNetIoC{class Program{private static void NormalMethod(){IPersonDao dao = new PersonDao();dao.Save();Console.WriteLine("我是一般方法");}}}

复制代码Program必然需要知道IPersonDao接口和PersonDao类。为了不暴露具体实现,我可以运用设计模式中的抽象工厂模式(Abstract Factory)来解决。

namespace DaoFactory{public static class DataAccess{public static IPersonDao CreatePersonDao(){return new PersonDao();}}}

复制代码FactoryMethod

namespace SpringNetIoC{class Program{ private static void FactoryMethod(){IPersonDao dao = DataAccess.CreatePersonDao();dao.Save();Console.WriteLine("我是工厂方法");}}}

复制代码这时,Program只需要知道IPersonDao接口和工厂,而不需要知道PersonDao类。然后我们试图想象,要是有这样的工厂框架帮我们管理依赖的对象就好了,于是控制反转出来了。 代码1依赖查找(Dependency Lookup)代码实现 依赖查找的主要问题是,这段代码必须依赖于JNDI环境,所以它不能在应用服务器之外运行,并且如果要用别的方式取代JNDI来查找资源和协作对象,就必须把JNDI代码抽出来重构到一个策略方法中去。4.依赖注入(Dependency Injection依赖注入的基本原则是:应用组件不应该负责查找资源或者其他依赖的协作对象。配置对象的工作应该由IoC容器负责,“查找资源”的逻辑应该从应用组件的代码中抽取出来,交给IoC容器负责。 下面分别演示3中注入机制。 代码2待注入的业务对象Content.java

package com.zj.ioc.di;public class Content {public void BusniessContent(){System.out.println("do business");}public void AnotherBusniessContent(){System.out.println("do another business");}}

MyBusniess类展示了一个业务组件,它的实现需要对象Content的注入。代码3,代码4,代码5,6分别演示构造子注入(Constructor Injection),设值注入(Setter Injection)和接口注入(Interface Injection)三种方式。 代码3构造子注入(Constructor Injection)MyBusiness.java

package com.zj.ioc.di.ctor;import com.zj.ioc.di.Content;public class MyBusiness {private Content myContent;public MyBusiness(Content content) {myContent = content;}public void doBusiness(){myContent.BusniessContent();}public void doAnotherBusiness(){myContent.AnotherBusniessContent();}}

代码4设值注入(Setter Injection)MyBusiness.java

package com.zj.ioc.di.set;import com.zj.ioc.di.Content;public class MyBusiness {private Content myContent;public void setContent(Content content) {myContent = content;}public void doBusiness(){myContent.BusniessContent();}public void doAnotherBusiness(){myContent.AnotherBusniessContent();}}

代码5设置注入接口InContent.java

package com.zj.ioc.di.iface;import com.zj.ioc.di.Content;public interface InContent {void createContent(Content content);}

代码6接口注入(Interface Injection)MyBusiness.java

package com.zj.ioc.di.iface;import com.zj.ioc.di.Content;public class MyBusiness implements InContent{private Content myContent;public void createContent(Content content) {myContent = content;}public void doBusniess(){myContent.BusniessContent();}public void doAnotherBusniess(){myContent.AnotherBusniessContent();}}

5.依赖拖拽(Dependency Pull)最后需要介绍的是依赖拖拽,注入的对象如何与组件发生联系,这个过程就是通过依赖拖拽实现。 代码7依赖拖拽示例

public static void main(String[] args) throws Exception{//get the bean factoryBeanFactory factory = getBeanFactory();MessageRender mr = (MessageRender) factory.getBean(“renderer”);mr.render();}

而通常对注入对象的配置可以通过一个xml文件完成。 使用这种方式对对象进行集中管理,使用依赖拖拽与依赖查找本质的区别是,依赖查找是在业务组件代码中进行的,而不是从一个集中的注册处,特定的地点执行。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。