依赖注入的三种方式
- 依赖注入:减小对象之间的耦合,通过spring来对对象内的属性赋值
- 依赖注入的数据类型:
- 基本数据类型和String类型
- 其他bean类型(在配置文件中或者注解配置过的bean)
- 复杂类型和集合类型
通过构造函数注入
- ==前提==:
- 构造函数注入的属性最好不经常发生改变
- 类中提供了有参的构造函数
- 构造函数注入:
- 使用的标签:
- 标签出现的位置:标签的内部
- 标签中的属性:
- type:指定要注入构造函数参数的数据类型,当存在多个相同数据类型的参数时会报错——==不推荐使用==
- index:指定要注入构造函数的参数的索引,从0开始——==不推荐使用==
- name:指定要注入构造函数的参数的名称——==常用==
- ——————————————————————————————————————
- value:注入基本数据类型和String数据类型的值
- ref:根据id注入复杂数据类型(在IOC容器中的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方法没有执行
注入集合类型
- 使用的标签:结构相同的标签可以互换
- 标签位置:标签内部
- 注入方式:
<bean id="xx" class="xx.xx.xx">
<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>
<property id="map">
<map>
<entry key="xxA" value="aaa"></entry>
<entry key="xxB">bbb</entry>
</map>
</property>
<property name="props">
<props>
<prop key="xxA">aaa</prop>
<prop key="xxb">bbb</prop>
</props>
</property>
</bean>