依赖注入的三种方式

1,015 阅读2分钟

依赖注入的三种方式

  • 依赖注入:减小对象之间的耦合,通过spring来对对象内的属性赋值
  • 依赖注入的数据类型:
    1. 基本数据类型和String类型
    2. 其他bean类型(在配置文件中或者注解配置过的bean)
    3. 复杂类型和集合类型

通过构造函数注入

  • ==前提==:
    1. 构造函数注入的属性最好不经常发生改变
    2. 类中提供了有参的构造函数
  • 构造函数注入:
    • 使用的标签:
    • 标签出现的位置:标签的内部
    • 标签中的属性:
      • type:指定要注入构造函数参数的数据类型,当存在多个相同数据类型的参数时会报错——==不推荐使用==
      • index:指定要注入构造函数的参数的索引,从0开始——==不推荐使用==
      • name:指定要注入构造函数的参数的名称——==常用==
      • ——————————————————————————————————————
      • value:注入基本数据类型和String数据类型的值
      • ref:根据id注入复杂数据类型(在IOC容器中的bean)
  • 注入方式:
<!--被注入的bean-->
<bean id="xxx" class="xx.xx.xx">
	<construtcor name="xx1" value="1"></construtcor>
    <constructor name="xx2" value="2"></constructor>
    <constructor name="xx3" ref="now"></constructor><!--引入容器中的日期对象-->
</bean>
<!--配置一个日期对象-->
<bean id="now" class="java.util.Date"></bean>
  • 构造函数注入的优势:在获取bean对象时,注入数据时必须的操作,否则对象无法成功创建
  • 构造函数注入的劣势:改变了bean的实例化方式,使我们在创建bean对象时,如果用不到这些数据,也必须提供

通过set方法注入

  • ==前提==:在类中提供了set方法
  • set方法注入:
    • 使用的标签:
    • 标签位置:标签内部
    • 标签属性
      • name:用于指定属性名称(set方法后的名称,首字母变小写)
      • value:注入基本数据和String
      • ref:引入复杂的数据类型和集合类型
  • 注入方式:
<bean id="xx" class="xx.xx.xx">
	<property name="name" value="周杰伦"></property>
    <property name="age" value="18"></property>
    <property name="birthday" ref="now"></property><!--引入复杂数据类型-->
</bean>
  • set方法注入的优势:创建对象时没有明确的限制,可以使用默认的构造函数
  • set方法注入的劣势:如果有某个成员必须有值,则获取对象时,有可能set方法没有执行

注入集合类型

  • 使用的标签:结构相同的标签可以互换
    • ,,:用于给list结构集合注入的标签
  • 标签位置:标签内部
  • 注入方式:
<bean id="xx" class="xx.xx.xx">
    <!--注入list结构的集合数据-->
    <property name="array">
        <array>
        	<value>aaa</value>
            <value>bbb</value>
        </array>
    </property>
    <property name="list">
    	<list>
        	<value>aaa</value>
            <value>bbb</value>
        </list>
    </property>
    <property name="set">
    	<set>
        	<value>aaa</value>
            <value>bbb</value>
        </set>
    </property>
    
    <!--注入Map结构的集合数据-->
    <property id="map">
    	<map>
        	<entry key="xxA" value="aaa"></entry>
            <entry key="xxB">bbb</entry><!--value写哪都可以(属性或标签体内)-->
        </map>
    </property>
    <property name="props">
    	<props>
        	<prop key="xxA">aaa</prop>
            <prop key="xxb">bbb</prop>
        </props>
    </property>
</bean>