2016-01-22 106 views
0

我已经经历了许多相同的stackoverflow答案,但我认为我仍然不清楚。我的理解是:依赖注入在java春天mvc

  1. 如果我们创建直接对象,如A a=new A();这将是 难以改变/每次处理信息。
  2. 依赖注入向我们提供了我们在运行时需要的而不是编译时。
  3. 在春天要实现依赖注入,我们必须使用 参数化的构造函数和setter方法(必需)。
  4. 依赖注入用于保持您的代码CLEAN和STABLE。 你是什么意思,干净和稳定? (请详细说明,如果你知道用简单的话 )

这是我了解到目前为止。请纠正我的错误,并请在非常简单的单词中添加一些要点(如果有的话),以便我能够轻松理解。

感谢提前:)

+0

依赖注入的主要目的是为了使测试更加简单 –

回答

0

1点是正确的,创建一个使用新的操作员将 对象导致与依赖紧耦合。请参见下面的 配置: -

<!--This is the material used for construction of structures --> 
    <bean id="constructionMaterial" class="com.construction.Brick" /> 

<!--Below are the three constructions structures --> 
    <bean id="building1" class="com.construction.structures.School"> 
    <property name="material" ref="constructionMaterial" /> 
    </bean> 
    <bean id="building2" class="com.construction.structures.College"> 
    <property name="material" ref="constructionMaterial" /> 
    </bean> 
    <bean id="building3" class="com.construction.structures.Hospital"> 
    <property name="material" ref="constructionMaterial" /> 
    </bean> 

在上面的例子中假设,如果施工材料改变了我只需要改变constructionMaterial的bean定义。

如果您会使用新的操作符,则必须更改三个班级的学校,学院,医院的代码。还是看起来不错,考虑是否有1000个不同的结构。

依赖注入也使测试非常容易,经过良好测试的代码 是稳定的。

Class A{ 
     public String method1(){ 
     B calcObject=new B(); 
     return "Calculated value is:"+calcObject.calculation(); 
     } 
    } 

如果我需要类A的单元测试方法1(),它不可能做到这一点而不类B,这反过来又冲突单元测试的概念的测试计算()。

如果我改变如以下代码:

Class A{ 

    private B b; 

     public String method1(){ 
     return "Calculated value is:"+b.calculation(); 
     } 
    public void setB(B b){ 
     this.b=b; 
      } 

    } 

在这种情况下,我可以很容易地模拟类B的对象,并执行类的方法1()的单元测试。您可以结帐如何使用模拟对象here执行测试。依赖注入再次成为这里的救星。

第3点不正确,如果您使用的注释类似@Autowired,即使您不使用setter方法或使用参数化构造函数,也没关系。 在这种情况下,依赖项由Reflection注入。

+0

谢谢你这么多@Amit先生 –

0

这并不容易理解,这对我来说太难了,所以不用担心。

如果我们创建像A a = new A()的直接对象; 每次更改/处理信息都很困难。

如果代码写得很好,那应该不难,spring只是为此提供配置。

2和3,是的,这是正确的。

关于4,清洁意味着你不会有代码来处理实际的注射,这意味着 线条状A a=new A(B,C,D);,我们在一个“注入”的依赖,春天会为我们。

稳定的意思是,你需要有有效的sprint配置来运行你的代码,这保证了注入的对象是所需的类型并且按照正确的顺序被初始化。

使用弹簧的另一个巨大优势是对象可重用性。正如你可能已经注意到的那样,你使用预定义的对象进行注入,它只能初始化为一次,如果没有弹簧,很难实现,通常在大型项目中甚至是不可能的。

更多使用弹簧,你不得不使用一些最好的面向对象的做法,否则你就能够使用弹簧。

你在春天使用Interfaces,所以你提到它很容易改变实现类的注入。

最后它提供了一个配置XML文件来保存所有的依赖关系是如何的酷是:)

+0

非常感谢你@Borislav先生:) –