为什么我们说Dependency Injection是一个Java Spring框架功能,而不是Java语言功能?

时间:2017-08-05 13:47:12

标签: java spring spring-mvc dependency-injection

  1. 我是Java Spring框架的新手。在一些文章中,他们说Spring框架具有依赖注入。为什么我们不说Java语言具有依赖注入功能,因为Spring基于Java?这种问题困扰了我一段时间。除了Java和Spring之外,我对ASP.NET MVC和C#也有这个问题。

  2. 以下是Spring Dependency Injection代码示例。如果我用Java创建一个小程序,它也会工作,对吗?

  3. 弹簧

    package com.example.service;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service
    public class DatabaseAccountService implements AccountService {
    
        private final RiskAssessor riskAssessor;
    
        @Autowired
        public DatabaseAccountService(RiskAssessor riskAssessor) {
            this.riskAssessor = riskAssessor;
        }
    
        // ...
    
    }
    

    Java:

    public class DatabaseAccountService implements AccountService {
    
        private final RiskAssessor riskAssessor;
    
        public DatabaseAccountService(RiskAssessor riskAssessor) {
            this.riskAssessor = riskAssessor;
        }
    
        // ...
    
    }
    

    更新(这是我困惑的地方):在纯Java中,我认为如果A类依赖于B类。在创建A类和B类之后,我们只需要去A类,然后做& #39;公众A(B b)'。除此之外,我们应该做些什么?

2 个答案:

答案 0 :(得分:3)

1)因为在Spring 自动依赖注入已准备好使用功能。在普通的java中,您必须自己查找或创建您的依赖项,然后将其注入dependee。

注意字自动化。严格来说,是的,依赖注入已经存在于普通的Java中 但是作者肯定是自动的。

2)你的代码会起作用,但是你必须自己找到或创建一个RiskAssessor的实例,如果你正在创建它(就是Spring没有为你做到这一点),你将不得不全部给它它的依赖关系,然后构建然后DatabaseAccoutService。

如果DatabaseAccountService的依赖关系依赖于它们自身的很多依赖关系,那么你将会认可Spring为你做的工作。希望:))

---广告你的更新: 是的,这就是它。感谢这样的构造函数A(B b),将依赖关系b注入到类A的实例中。只是不要忘记,您将希望实际上将类B的实例作为参数调用构造函数A. 那就是你需要将B实例作为参数传递给你的地方。而且你必须创建它,并随着它创建它。 这就是为什么许多人使用DI框架收集家属并注入它们。

答案 1 :(得分:1)

  1. 因为你有其他框架提供除Spring以外的依赖注入。 Java是一种通用语言,并且构建了许多框架来实现某些"作业"和要求,使它们更容易完成。
  2. 想象一下,你需要使用钻头在墙上钻一个洞。你是否每次需要钻孔时都要自己钻一个钻头,或者你要重复使用同一个钻头,只是为它的使用提供动力? https://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html

    1. 当您在没有依赖性限制的情况下实例化DataBaseAccountService时,您的RiskAssessor可以是该类的任何实例。但是,当你有DI时,基本上框架将确保为该字段分配正确的(提供那里没有歧义)实例bean。它确保您必须在配置类中定义bean,为其提供某些属性,然后在整个应用程序中使用具有相同属性和功能的相同bean,并且不在每次需要时重新实例化它。
相关问题