Spring 支持 3 种依赖注入的方式
属性注入
构造方法注入
工厂方法注入
属性注入:
属性注入即通过 setter 方法注入Bean 的属性值或依赖的对象
属性注入使用 <property> 元素, 使用 name 属性指定 Bean 的属性名称,value 属性或 <value> 子节点指定属性值
属性注入是实际应用中最常用的注入方式
注意:类必须具有显式或隐式的无参构造方法
Bean的名称可以使用id或者name,同一个Bean中id和name可以一样,也可以不一样,但是不同Bean的id和name不能重复
<bean id="s1" name="s1" class="com.han.vo.Student">
<property name="id" value="1"></property>
<property name="name">
<value>韩少斌</value>
</property>
<property name="phone">
<value>4567890</value>
</property>
</bean>
构造方法注入:
通过构造方法注入Bean 的属性值或依赖的对象,它保证了 Bean 实例在实例化后就可以使用。
构造器注入在 <constructor-arg > 元素里声明属性
index属性用来标识是第几个参数的,默认可以不写,按照构造方法的参数顺序
type属性用来标识该参数的类型,一般也不用写,在遇到有参数个数相同的构造方法时使用
<bean id="s2" class="com.han.vo.Student">
<constructor-arg value="2" index="0" type="int"></constructor-arg>
<constructor-arg index="2" type="String">
<value>57890986</value>
</constructor-arg>
<constructor-arg index="1">
<value>尼古拉斯-赵四</value>
</constructor-arg>
</bean>
工厂注入:
工厂注入分为静态工厂和实例工厂
dog为静态工厂注入,class属性指定工厂类,factiory-method指定返回实例的方法
cat为实例工厂注入,首先要配置实例工厂类的Bean,配置cat Bean时,用factory-bean来指定工厂Bean,仍然使用factory-method指定返回实例的方法
引用其它Bean
在注入时,若属性是其他Bean,则可以通过 <ref> 元素或 ref 属性为 Bean 的属性或构造方法参数指定对 Bean 的引用.
<bean id="teacher" name="teacher0" class="com.han.vo.Teacher">
<property name="name" value="韩少斌"></property>
<property name="student" ref="s1"></property>
</bean>
<bean id="teacher0" name="teacher0" class="com.han.vo.Teacher">
<property name="name" value="韩少斌"></property>
<property name="student">
<ref bean="s1"/>
</property>
</bean>
内部 Bean
当 Bean 实例仅仅给一个特定的属性使用时, 可以将其声明为内部 Bean. 内部 Bean 声明直接包含在 <property> 或 <constructor-arg> 元素里, 不需要设置任何 id 或 name 属性
内部 Bean 不能在任何其他地方使用
<bean id="teacher1" name="teacher1" class="com.han.vo.Teacher">
<property name="name" value="韩少斌"></property>
<property name="student">
<bean id="liyuanpeng" class="com.han.vo.Student">
<property name="id" value="3"></property>
<property name="name" value="李元鹏"></property>
<property name="phone" value="110"></property>
</bean>
</property>
</bean>
集合属性:
在 Spring中可以通过一组内置的 xml 标签(例如: <list>, <set> 或 <map>) 来配置集合属性.
配置 java.util.List 类型的属性, 需要指定 <list> 标签, 在标签里包含一些元素. 这些标签可以通过 <value> 指定简单的常量值, 通过 <ref> 指定对其他 Bean 的引用.
数组的定义和 List 一样, 都使用<list>
配置 java.util.Set 需要使用 <set> 标签, 定义元素的方法与 List 一样.
Java.util.Map 通过 <map> 标签定义, <map> 标签里可以使用多个 <entry> 作为子标签. 每个条目包含一个键和一个值.
必须在 <key> 标签里定义键,因为键和值的类型没有限制, 所以可以自由地为它们指定 <value>, <ref>, <bean> 或 <null> 元素.
可以将 Map 的键和值作为 <entry> 的属性定义: 简单常量使用 key 和 value 来定义; Bean 引用通过 key-ref 和 value-ref 属性定义
使用 <props> 定义 java.util.Properties, 该标签使用多个 <prop> 作为子标签. 每个 <prop> 标签必须定义 key 属性.
<bean name="manager" class="com.han.vo.Manager">
<property name="name" value="饲养员"></property>
<property name="students">
<list>
<ref bean="s1"/>
<ref bean="s2"/>
<ref bean="s3"/>
<bean class="com.han.vo.Student">
<property name="id" value="4"></property>
<property name="name" value="苏艳"></property>
<property name="phone" value="114"></property>
</bean>
</list>
</property>
<property name="teachers">
<set>
<ref bean="teacher0"/>
<ref bean="teacher1"/>
<ref bean="teacher2"/>
<ref bean="teacher3"/>
</set>
</property>
<property name="ms">
<map>
<entry key="student1" value-ref="s1"></entry>
<entry key="student2" value-ref="s2"></entry>
<entry key="student3" value-ref="s3"></entry>
</map>
</property>
<property name="properties">
<props>
<prop key="driverClass">com.mysql.jdbc.Driver</prop>
<prop key="url">jdbc:mysql://localhost:3306/mybd</prop>
<prop key="user">root</prop>
<prop key="password">************</prop>
</props>
</property>
</bean>