【Spring 工厂】注入详解 — Set 注入(JDK 内置类型
String+8 种基本类型
<property name="id">
<value>10</value>
</property>
<property name="name">
<value>yusael</value>
</property>
数组
<property name="emails">
<list>
<value>abc@qq.com</value>
<value>123@qq.com</value>
<value>hello@qq.com</value>
</list>
</property>
Set 集合
<property name="tels">
<set>
<value>138xxxxxxxxxx</value>
<value>139xxxxxxxxxx</value>
</set>
</property>
List 集合
<property name="addresses">
<list>
<value>China</value>
<value>Earth</value>
<value>hell</value>
</list>
</property>
Map 集合
<property name="qqs">
<map>
<entry>
<key><value>hello</value></key>
<value>12312312312</value>
</entry>
<entry>
<key><value>world</value></key>
<value>21314214214</value>
</entry>
</map>
</property>
Properites
<property name="p">
<props>
<prop key="key1">value1</prop>
<prop key="key2">value2</prop>
<prop key="key3">value3</prop>
</props>
</property>
复杂 JDK 类型(Date、…)
需要程序员自定义类型转换器,处理。
第一种方式
[开发步骤]:
为成员变量提供 set get 方法
配置文件中进行注入(赋值)
<bean id="userService" class="com.yusael.service.UserServiceImpl">
<property name="userDAO">
<bean class="com.yusael.dao.UserDAOImpl"/>
</property>
</bean>
第二种方式
第?种赋值方式存在的问题:
配置文件代码冗余;
被注入的对象 (UserDAO)多次创建,浪费(JVM)内存资源。
[开发步骤]:
为成员变量提供 set get 方法;
配置文件中进行配置;
<bean id="userDAO" class="com.yusael.dao.UserDAOImpl"></bean>
<bean id="userService" class="com.yusael.service.UserServiceImpl">
<property name="userDAO">
<ref bean="userDAO"/>
</property>
</bean>
Spring4.x 废除了 <ref local=""/>
基本等效 <ref bean=""/>
;
基于属性的简化
JDK 类型注入:
<property name="id">
<value>10</value>
</property>
JDK 类型注入简化:value
属性只能简化 8 种基本类型 + String 注入标签;
<property name="id" value="10"/>
用户自定义类型注入:
<bean id="userDAO" class="com.yusael.dao.UserDAOImpl"></bean>
<bean id="userService" class="com.yusael.service.UserServiceImpl">
<property name="userDAO">
<ref bean="userDAO"/>
</property>
</bean>
用户自定义类型注入简化:
<bean id="userDAO" class="com.yusael.dao.UserDAOImpl"></bean>
<bean id="userService" class="com.yusael.service.UserServiceImpl">
<property name="userDAO" ref="userDAO"/>
</bean>
基于 p 命名空间的简化
JDK 类型注入:
<bean id="person" name="p" class="com.yusael.basic.Person">
<property name="id">
<value>10</value>
</property>
<property name="name">
<value>yusael</value>
</property>
</bean>
JDK 类型注入 - 基于 p 命名空间的简化。
<bean id="person" name="p" class="com.yusael.basic.Person"
p:name="yusael" p:id="10"/>
用户自定义类型注入:
<bean id="userDAO" class="com.yusael.dao.UserDAOImpl"></bean>
<bean id="userService" class="com.yusael.service.UserServiceImpl">
<property name="userDAO">
<ref bean="userDAO"/>
</property>
</bean>
用户自定义类型注入 - 基于 p 命名空间的简化。
<bean id="userDAO" class="com.yusael.dao.UserDAOImpl"></bean>
<bean id="userService" class="com.yusael.service.UserServiceImpl"
p:userDAO-ref="userDAO"/>
=======================================================================
注入:通过 Spring 的配置文件,为成员变量赋值;
Set 注入:Spring 调用 Set 方法 通过 配置文件 为成员变量赋值;
构造注入:Spring 调用 构造方法 通过 配置文件 为成员变量赋值;
提供有参构造方法
public class Customer {
private String name;
priva
te int age;
public Customer(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Customer{" +
"name='" + name + ''' +
", age=" + age +
'}';
}
}
spring 配置文件
<bean id="customer" class="com.yusael.constructor.Customer">
<constructor-arg>
<value>zhenyu</value>
</constructor-arg>
<constructor-arg>
<value>21</value>
</constructor-arg>
</bean>
参数个数不同
参数个数不同时,通过控制 <constructor-arg>
标签的数量进行区分;
如果只有一个参数的话,只需要一对 <constructor-arg>
标签:
<bean id="customer" class="com.yusael.constructor.Customer">
<constructor-arg>
<value>zhenyu</value>
</constructor-arg>
</bean>
如果有两个参数的话,用两对 <constructor-arg>
标签,以此类推。
<bean id="customer" class="com.yusael.constructor.Customer">
<constructor-arg>
<value>zhenyu</value>
</constructor-arg>
<constructor-arg>
<value>22</value>
</constructor-arg>
</bean>
评论