zoukankan      html  css  js  c++  java
  • Spring学习之注入方式

    我们知道,Spring对象属性的注入方式有两种:设值注入和构造注入。
      假设有个类为People,该对象包含三个属性,name和school还有age,这些属性都有各自的setter和getter方法,还有一个包含这三个属性的构造方法。如果用spring来管理这个对象,那么有以下两种方式为People设置属性:
     (1)设值注入

    1 <bean id="people" class="com.abc.People">
    2    <property name="name" value="张三" /> <!-- 设值注入 -->
    3    <property name="school" ref="school" /> <!-- 设值注入 -->
    4    <property name="age" value="20" type="int" />
    5 </bean>
    6 <bean id="school" class="com.abc.School" />

    (2)构造注入

    1 <bean id="people" class="com.abc.People">
    2     <!-- 构造注入,index=0表示构造器的第一个参数 -->
    3    <constructor-arg index="0" value="张三"/> 
    4    <constructor-arg index="1" ref="school" /> <!-- 构造注入 -->
    5    <constructor-arg index="2" value="20" type="int" />
    6 </bean>
    7 <bean id="school" class="com.abc.School" />
     

      那么,这两种注入方式有和区别呢?下面做简单比较: 
      在过去的开发过程中,这两种注入方式都是非常常用的,Spring也同时支持两种依赖注入方式:设值注入和构造注入,这两种依赖注入的方式,并没有绝对的好坏,只是适应的场景有所不同。相比之下,设值注入有如下优点:

    • 设值注入需要该Bean包含这些属性的setter方法

    • 与传统的JavaBean的写法更相似,程序开发人员更容易理解、接收,通过setter方法设定依赖关系显得更加直观。

    • 对于复杂的依赖关系,如果采用构造注入,会导致构造器过于臃肿,难以阅读。Spring在创建Bean实例时,需要同时实例化依赖的全部实例,因而导致性能下降,而使用设值注入,则能避免这些问题

    • 尤其是在某些属性可选的情况况下,多参数的构造器显得更加笨重。构造注入也不是绝对不如设值注入,在某些特定的场景下,构造注入比设值注入更加优秀。构造注入有以下优势:

    • 构造注入有以下优势
    • 构造注入需要该Bean包含带有这些属性的构造器

    • 构造注入可以在构造器中决定依赖关系的注入顺序,优先依赖的优先注入。例如,组件中其他依赖关系的注入,常常要依赖于DataSrouce的注入。采用构造注入,可以在代码中清晰的决定注入顺序。

    • 对于依赖关系无需变化的Bean,构造注入更有用处,因为没有Setter方法,所有的依赖关系全部在构造器内设定。因此,无需担心后续的代码对依赖关系产生破坏。

    • 依赖关系只能在构造器中设定,则只有组件的创建者才能改变组件的依赖关系。对组件的调用者而言,组件内部的依赖关系完全透明,更符合高内聚的原则。

      建议:采用以设值注入为主,构造注入为辅的注入策略。对于依赖关系无需变化的注入,尽量采用构造注入;而其他的依赖关系的注入,则考虑采用设值注入。

  • 相关阅读:
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第50章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第49章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第48章 读书笔记(待更新)
    Spring Boot 中使用 Quartz 实现任务调度
    实战 FastDFS Java 客户端上传文件
    分布式文件系统之 FastDFS
    Java 持久层框架之 MyBatis
    C语言实现贪吃蛇
    [转载]分享三篇非常好的学习心得
    selenium加载cookie报错问题:selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain
  • 原文地址:https://www.cnblogs.com/sunfie/p/4783167.html
Copyright © 2011-2022 走看看