属性注入
注入方式
手动注入
1 setter方法注入
2 构造器注入
<bean id="key" class="dao.Impl.KeyWordsSearchDaoImpl" lazy-init="false"></bean>
<!-- 配置业务层bean -->
<bean id="service" class="service.impl.KeyWordsSearchServiceDaoImpl" scope="prototype" init-method="initService">
<!-- 构造器完成属性注入 -->
<!-- index属性值为目标属性在含参构造器中作为形参的位置
属性为基本数据类型时,既可以在constructor标签中直接使用value属性进行属性值的设定,也可以使用其子标签value进行设定
-->
<constructor-arg index="0">
<value type="java.lang.String">我是spring的创始人约翰大叔哦</value>
</constructor-arg>
<!-- 属性为对象属性时 既可以在constructor标签中直接使用ref属性指定bean,也可以使用其子标签ref指定bean -->
<constructor-arg index="1">
<!-- ref的bean和local的区别:
bean:会在所有已加载的spring配置文件(包括本配置文件以外的其他的spring子配置文件)中寻找id为bean=""的bean实例
local:只在当前该配置文件中寻找目标bean
-->
<ref bean="key"/>
</constructor-arg>
</bean>
自动注入
即不用再手动的在bean标签中进行属性的注入,由spring自动完成注入
bean标签的autowire属性 有3种取值:
1 byName:根据属性名自动注入,要求bean的id值key和KeyWordSearchServiceDaoImpl类中的属性名key一致;
<!--配置数据访问层bean -->
<bean id="key" class="dao.Impl.KeyWordsSearchDaoImpl"></bean>
<!-- 配置业务层bean -->
<bean id="service" class="service.impl.KeyWordsSearchServiceDaoImpl" autowire="byName">
2 byType:和byName不同,它是根据属性的类型来注入。比如在UserService类中有一个属性udao,也有setUdao法。只需要保证在配置文件中有一个和udao属性的类型一样的bean,就可以完成自动注入
3 dependency-check:
注入类型
基本类型( setter或constructor 均可用)
bean的子标签属性值或
bean标签的value属性直接注入值
<bean id="cha1" class="domain.Cha">
<property name="name">
<value type="java.lang.String">张建</value>
</property>
<property name="gender">
<value>男</value>
</property>
</bean>
<bean id="cha1" class="domain.Cha" scope="prototype">
<property name="name" value="张建"></property>
<property name="gender" value="男"></property>
</bean>
对象类型: 使用property标签的ref属性引用另一个bean或
使用property的子标签ref 完成对象属性的注入
ref标签的两个属性:
bean:外部引用:从已加载的配置文件中寻找目标bean
local:从当前本配置文件中寻找目标bean
<bean id='dat' class="java.util.Date"></bean>
<bean id="keyWords" class="domain.KeyWords">
<!-- 对象类型 -->
<property name="addTime" ref="dat"></property>
</bean>
集合类型:
<bean id="cha1" class="domain.Cha" scope="prototype">
<property name="name">
<value type="java.lang.String">张建</value>
</property>
<property name="gender">
<value>男</value>
</property>
</bean>
<bean id="cha2" class="domain.Cha" scope="prototype">
<property name="name">
<value type="java.lang.String">zhangyongzhe</value>
</property>
<property name="gender" value="nv">
</property>
</bean>
list
<bean id="keyWords" class="domain.KeyWords">
<!-- list类型 -->
<property name="chaList">
<!-- list加泛型后 加上value-tpye属性 -->
<list value-type="domain.Cha">
<ref bean="cha1" />
<ref bean="cha2" />
</list>
</property>
</bean>
set
<bean id="keyWords" class="domain.KeyWords">
<!-- set类型 -->
<property name="chaSet">
<!-- Set加泛型后 加上value-tpye属性 -->
<set value-type="domain.Cha">
<!-- set容器中的自定义类Cha不用我们再重写equals和hashcode方法.spring会动态重写这两个方法 -->
<ref bean="cha1" />
<ref bean="cha2" />
</set>
</property>
</bean>
map
<bean id="keyWords" class="domain.KeyWords">
<!-- map类型 -->
<property name="chaMap">
<!-- Map加泛型后 加上key-type和value-type属性 -->
<map key-type="java.lang.String" value-type="domain.Cha">
<entry key="one" value-ref="cha1"></entry>
<entry key="two" value-ref="cha2"></entry>
</map>
</property>
</bean>
properties
<!-- 配置JDBCHelper类的bean -->
<bean id="jdbcHelper" class="commons.JDBCHelper">
<!-- properties是系统类,不是自定义的类,用props标签及其子标签进行属性注入 -->
<property name="properties">
<props>
<!-- 数据库驱动 -->
<prop key="driver">com.mysql.jdbc.Driver</prop>
<!-- url -->
<prop key="url">jdbc:mysql://localhost:3306/test</prop>
<!-- 用户名 -->
<prop key="root">root</prop>
<!-- 密码 -->
<prop key="password">root</prop>
</props>
</property>
</bean>