<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ 依赖注入 - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ freeCodeCamp 是一个免费学习编程的开发者社区，涵盖 Python、HTML、CSS、React、Vue、BootStrap、JSON 教程等，还有活跃的技术论坛和丰富的社区活动，在你学习编程和找工作时为你提供建议和帮助。 ]]>
        </description>
        <link>https://www.freecodecamp.org/chinese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ 依赖注入 - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/chinese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Wed, 06 May 2026 14:33:26 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/chinese/news/tag/dependency-injection/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ 依赖注入是什么？如何使用它？ ]]>
                </title>
                <description>
                    <![CDATA[ 简介 > 在软件工程 [https://www.wikiwand.com/zh/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B]中，依赖注入 （dependency injection）的意思为，给予调用方它所需要的事物。“依赖”是指可被方法调用的事物。依赖注入形式下，调用方不再直接指使用“依赖”，取而代之是“注入” 。“注入”是指将“依赖”传递给调用方的过程。在“注入”之后，调用方才会调用该“依赖”。传递依赖给调用方，而不是让让调用方直接获得依赖，这个是该设计的根本需求。在编程语言角度下，“调用方”为对象和类，“依赖”为变量。在提供服务的角度下，“调用方”为客户端，“依赖”为服务。 这是维基百科的定义，不是很容易理解。在这篇文章里，让我们更好地理解依赖注入。 在理解它在编程中的含义之前，首先让我们了解一下它的总体含义，这可以帮助我们更好地理解这个概念。 依赖是指依靠某种东西来获得支持。比如我会说我们对手机的依赖程度过高。 在讨论依赖注入 [https://www.wikiwand.com/zh/%E4%BE%9D%E8%B5%96%E6%B3%A8%E ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/a-quick-intro-to-dependency-injection-what-it-is-and-when-to-use-it/</link>
                <guid isPermaLink="false">60541d226ce45b059394bb1f</guid>
                
                    <category>
                        <![CDATA[ 依赖注入 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Java ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chengjun.L ]]>
                </dc:creator>
                <pubDate>Fri, 19 Mar 2021 04:10:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2021/03/1_rU6KNs9KfdROiENL-UQTNA.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <h3 id="-"><strong>简介</strong></h3><blockquote>在<a href="https://www.wikiwand.com/zh/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B">软件工程</a>中，<strong><strong>依赖注入</strong></strong>（dependency injection）的意思为，给予调用方它所需要的事物。“依赖”是指可被方法调用的事物。依赖注入形式下，调用方不再直接指使用“依赖”，取而代之是“注入” 。“注入”是指将“依赖”传递给调用方的过程。在“注入”之后，调用方才会调用该“依赖”。传递依赖给调用方，而不是让让调用方直接获得依赖，这个是该设计的根本需求。在编程语言角度下，“调用方”为对象和类，“依赖”为变量。在提供服务的角度下，“调用方”为客户端，“依赖”为服务。</blockquote><p>这是维基百科的定义，不是很容易理解。在这篇文章里，让我们更好地理解依赖注入。</p><p>在理解它在编程中的含义之前，首先让我们了解一下它的总体含义，这可以帮助我们更好地理解这个概念。</p><p>依赖是指依靠某种东西来获得支持。比如我会说我们对手机的依赖程度过高。</p><p>在讨论<a href="https://www.wikiwand.com/zh/%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5">依赖注入</a>之前，我们先理解编程中的依赖是什么意思。</p><p>当 class A 使用 class B 的某些功能时，则表示 class A 具有 class B 依赖。</p><p>在 Java 中，在使用其他 class 的方法之前，我们首先需要创建那个 class 的对象（即 class A 需要创建一个 class B 实例）。</p><p><strong>因此，将创建对象的任务转移给其他 class，并直接使用依赖项的过程，被称为“依赖项注入”。</strong></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/1*TF-VdAgPfcD497kAW77Ukg.png" class="kg-image" alt="1*TF-VdAgPfcD497kAW77Ukg" width="800" height="267" loading="lazy"><figcaption>如果代码会说话？</figcaption></figure><h3 id="--1"><strong>为什么需要使用依赖注入？</strong></h3><p>假设我们有一个 car class，其中包含各种对象，例如车轮、引擎等。</p><p>这里的 car class 负责创建所有依赖对象。现在，如果我们决定将来放弃 <strong>MRFWheels</strong>，而希望使用 <strong><strong>Yokohama</strong></strong> 车轮，该怎么办？</p><p>我们将需要使用新的 Yokohama 依赖关系来重新创建 car 对象。但是，当使用依赖注入（DI）时，我们可以在运行时更改车轮 wheels（因为可以在运行时而不是在编译时注入依赖项）。</p><p>你可以将依赖注入视为代码中的中间人，它负责创建想要的 wheels 对象，并将其提供给car class。</p><p>它使 car class 不需要创建车轮 wheels、电池 battery 对象等。</p><h4 id="--2"><strong>有三种类型的依赖注入：</strong></h4><ul><li><strong>构造函数注入：</strong>依赖关系是通过 class 构造器提供的。</li><li><strong>setter 注入：</strong>注入程序用客户端的 setter 方法注入依赖项。</li><li><strong>接口注入：</strong>依赖项提供了一个注入方法，该方法将把依赖项注入到传递给它的任何客户端中。客户端必须实现一个接口，该接口的 setter 方法接收依赖。</li></ul><p><strong>依赖注入的作用是：</strong></p><ul><li>创建对象</li><li>知道哪些类需要那些对象</li><li>并提供所有这些对象</li></ul><p>如果对象有任何更改，则依赖注入会对其进行调查，并且不应影响到使用这些对象的类。这样，如果将来对象发生变化，则依赖注入负责为类提供正确的对象。</p><h4 id="--3"><strong>控制反转——依赖注入背后的概念</strong></h4><p>这是指一个类不应静态配置其依赖项，而应由其他一些类从外部进行配置。</p><p>这是 <a href="https://chinese.freecodecamp.org/news/solid-principles/">S.O.L.I.D 的第五项原则</a>——一类应该依赖于抽象，而不是依赖于具体的东西（简单地说，就是硬编码）。</p><p>根据这些原则，一个类应该专注于履行其职责，而不是创建履行这些职责所需的对象。 这就是<strong>依赖注入</strong>发挥作用的地方：它为类提供了必需的对象。</p><h4 id="--4">使用依赖注入的优势</h4><ul><li>帮助进行单元测试。</li><li>由于依赖关系的初始化是由注入器组件完成的，因此减少了样板代码。</li><li>扩展应用程序变得更加容易。</li><li>帮助实现松耦合，这在应用编程中很重要。</li></ul><h4 id="--5"><strong>使用依赖注入的劣势</strong></h4><ul><li>学习起来有点复杂，如果使用过度会导致管理问题和其他问题。</li><li>许多编译时错误被推送到运行时。</li><li>依赖注入框架是通过反射或动态编程实现的。这可能会妨碍 IDE 自动化的使用，例如“查找引用”，“显示调用层次结构”和安全重构。</li></ul><p>你可以自己实现依赖项注入，也可以使用第三方库或框架来实现。</p><h4 id="--6"><strong><strong><strong>实现依赖注入的库和框架</strong></strong></strong></h4><ul><li><a href="https://www.tutorialspoint.com/spring/spring_dependency_injection.htm" rel="noopener">Spring </a>(Java)</li><li><a href="https://github.com/google/guice" rel="noopener">Google Guice</a> (Java)</li><li><a href="http://square.github.io/dagger/" rel="noopener">Dagger </a>(Java and Android)</li><li><a href="https://github.com/castleproject/Windsor" rel="noopener">Castle Windsor</a> (.NET)</li><li><a href="https://www.microsoft.com/en-us/download/details.aspx?id=39944" rel="noopener">Unity</a> (.NET)</li></ul><p><strong><strong>你可以查看下列资源</strong>，了解更多关于依赖注入的信息：</strong></p><p><a href="https://www.journaldev.com/2394/java-dependency-injection-design-pattern-example-tutorial" rel="noopener"><strong><strong>Java 依赖注入——</strong> <strong>DI 设计模式示例教程 — JournalDev</strong></strong></a></p><p><strong><a href="http://www.vogella.com/tutorials/DependencyInjection/article.html"><strong>在</strong> J<strong>ava</strong> 中使用依赖注入——<strong>Vogella</strong></a></strong></p><p><a href="https://www.martinfowler.com/articles/injection.html" rel="noopener"><strong><strong>控制反转和依赖注入模式—— Martin Fowler</strong></strong></a></p><p>希望这篇文章能够帮助你理解依赖注入！</p><p>如果你喜欢这篇文章，并且想阅读更多精彩文章，请关注我（<a href="https://medium.com/@bhavyankaria" rel="noopener">Bhavya Karia</a>），支持我写作更多文章。</p><p>如果你有任何问题或反馈，可以通过 <a href="https://www.linkedin.com/in/bhavya-karia-1b115a93/" rel="noopener">LinkedIn</a>、<a href="https://twitter.com/thebhavyakaria" rel="noopener">Twitter</a>、<a href="https://www.facebook.com/karia.bhavya" rel="noopener">Facebook</a> 联系我。</p><p>如果你想在 JavaScript 中应用依赖注入，<a href="https://www.freecodecamp.org/news/a-quick-intro-to-dependency-injection-what-it-is-and-when-to-use-it-7578c84fa88f/undefined" rel="noopener">Jo Surikat</a> 建议你使用他的库：<a href="https://di-ninja.github.io/di-ninja/" rel="noopener">Di-Ninja</a>。</p><p><a href="https://www.freecodecamp.org/news/a-quick-intro-to-dependency-injection-what-it-is-and-when-to-use-it-7578c84fa88f/undefined" rel="noopener">Nicolas Froidure</a> 介绍了另一个可在 JavaScript 应用依赖注入的库：<a href="https://github.com/nfroidure/knifecycle" rel="noopener">knifecycle</a>。</p><p>如果你是一名 PHP 开发者，<a href="https://www.freecodecamp.org/news/a-quick-intro-to-dependency-injection-what-it-is-and-when-to-use-it-7578c84fa88f/undefined" rel="noopener">Gordon Forsythe</a> 推荐你尝试这个库：<a href="https://github.com/rdlowrey/auryn" rel="noopener">auryn</a>。</p><p>欢迎你把这篇文章分享给更多人！</p><p>原文：<a href="https://www.freecodecamp.org/news/a-quick-intro-to-dependency-injection-what-it-is-and-when-to-use-it-7578c84fa88f/">A quick intro to Dependency Injection: what it is, and when to use it</a>，作者：Bhavya Karia</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
