首页 > 其他分享 >依赖注入(DI)、控制反转(IOC)、反射的区别和联系?

依赖注入(DI)、控制反转(IOC)、反射的区别和联系?

时间:2023-08-01 14:27:06浏览次数:32  
标签:反射 依赖 DI 反转 AInterface 接口 new IOC

实现IOC控制反转的技术叫做反射。而反射通俗的说,反射就是根据给出的类名(字符串)来生成对象。这种编程方式可以让应用在运行时才动态决定生成哪一种对象。反射的应用是很广泛的,像Hibernate、Spring中都是用“反射”做为最基本的技术手段。

其实可以把IoC模式看作工厂模式的升华,把IoC容器看作是一个大工厂,只不过这个大工厂里要生成的对象都是在XML文件中给出定义的。

可以认为IOC是为了解决接口驱动而产生的。那么接口模式有何弊端?

Interface Driven Design叫接口驱动,接口驱动有很多好处,可以提供不同灵活的子类实现,增加代码稳定和健壮性等等,但是接口一定是需要实现的,也就是如下语句迟早要执行:AInterface a = new AInterfaceImp(); 这样一来,耦合关系就产生了,如:

classA
{
    AInterface a;

    A(){}
    
    AMethod()//一个方法
    {
        a = new AInterfaceImp();
    }
}

Class A与AInterfaceImp就是依赖关系,如果想使用AInterface的另外一个实现就需要更改代码了。当然我们可以建立一个Factory来根据条件生成想要的AInterface的具体实现,即:

InterfaceImplFactory
{
   AInterface create(Object condition)
   {
      if(condition == condA)
      {
          return new AInterfaceImpA();
      }
      else if(condition == condB)
      {
          return new AInterfaceImpB();
      }
      else
      {
          return new AInterfaceImp();
      }
    }
}

表面上来看确实是在一定程度上缓解了以上问题,但实质上这种代码耦合并没有改变。通过IoC模式可以彻底解决这种耦合,它把耦合从代码中移出去,放到统一的XML 文件中,通过一个容器在需要的时候把这个依赖关系形成,即把需要的接口实现注入到需要它的类中,这可能就是“依赖注入”说法的来源了。

可见,依赖注入是指接口和它的实现类之间的动态关联的技术。

IOC(控制反转)和DI(依赖注入)的关系:要实现控制反转,需要经过两步,其中第一步是查找依赖,第二步是依赖注入。而要实现这两步需要用到反射技术,以及类似工厂模式的设计风格,只不过这个工厂模式是以XML的方式来展现的。

标签:反射,依赖,DI,反转,AInterface,接口,new,IOC
From: https://www.cnblogs.com/2008nmj/p/17596316.html

相关文章

  • 原生php 接入redis 详细步骤
    前言环境:win10php5.4IIS10 一.安装php-redis扩展下载地址:https://windows.php.net/downloads/pecl/releases/redis/注意选择好对应的版本,图中2.2.7指的是redis的版本,后边的5.4指php版本,还有vc9和x86,这些可以在phpinfo当中查到。 下载好之后解压,复制包里的php_redis.d......
  • RichEdit RTF格式文本的存储和读取 VC++
    Rtf格式文本的读写,向控件发送EM_STREAMIN和EM_STREAMOUT消息,控件把格式文本显示或从把显示内容转化为格式文本。接口是用户定义的回调函数,格式文本由参数DWORD_PTRdwCookie传递。从控件读出RTF文本,参数用string比较好,因为消息处理是根据文本的长度,多次调用回调函数,传出数......
  • Codeforces Round 888 (Div. 3)
    比赛链接:https://codeforces.com/contest/1851A.EscalatorConversations题意:一个扶梯,共m阶,n人站,每个台阶高k,Vlad身高H,Vlad任意站,问有多少人站在这个扶梯上正好和Vlad齐平满足abs(H-h[i])%k==0&&abs(H-h[i])/k<=m-1&&H!=h[i]即可B.ParitySort题意:给出......
  • ZLMediaKit WebRTC用法介绍
    一、WebRTC简介WebRTC是一个开源的实时通信技术,它支持浏览器和原生应用程序之间的实时音频/视频通信。WebRTC为音频和视频的传输提供了支持,也为数据的传输提供了支持,使得开发者可以用较少的代码来实现实时通信的功能。二、ZLMediaKitWebRTC介绍ZLMediaKit是一个开源的流媒体服务框......
  • XorDistances
    [ABC201E]XorDistances首先,根据\(a\oplusa=0\),一条路径\(dis(u,v)=(dis(1,\text{LCA})\oplusdis(1,u))\oplus(dis(1,\text{LCA})\oplusdis(1,v))\),消去相同的,得\(dis(1,u)\oplusdis(1,v)\)。预处理从\(1\)到每个点的前缀异或,问题被转换成从\(n\)个数中选两个两两异......
  • Revit二次开发-用GDI+绘制线样式
      最近有个需求就是将动态讲当前文档中的线样式绘制出来,并且显示在自己的UI上。查阅了一下api文档以及吉米大佬的博客,并且这篇博客中受到启发填充样式绘制然后自己琢磨了一下,成功将线样式绘制出来了。但是目前有个问题就是圆点我在dashpattern里面设置的是1f的单位,如果图片......
  • Audition 2023中文mac版为你的音频设计一个更好的视频
    Audition2023mac中文版是Adobe公司开发的一款音频制作工具,在音频处理方面有很大的应用。虽然它是一个免费的音频解决方案,但AdobeAudition提供了新的功能,使其成为艺术家和设计师所需要的所有工具中最出色的。因此,只需几分钟就可以完成设计和制作更好的音频。对于那些想要创建......
  • 限制IP对接口的调用频率_基于Redis实现
    pom.xml引入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>逻辑代码 privatebooleanli......
  • Redis 基础
    1.Redis入门1.1Redis简介Redis是一个基于内存的key-value结构数据库。Redis是互联网技术领域使用最为广泛的存储中间件。官网:https://redis.io中文网:https://www.redis.net.cn/key-value结构存储:主要特点:基于内存存储,读写性能高适合存储热点数据(热点商品、资讯、新闻......
  • Longest Divisors Interval
    Smiling&Weeping----总有一个人,一直住在心底,却消失在生活里。Givenapositiveintegern,findthemaximumsizeofaninterval[l,......