<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<!-- 通过无参构造创建对象 -->
<!--
一个bean代表一个实体类
id:自定义对象的唯一标识符(使用getBean("id");方法获取对象)
class:实体类全限定名
-->
<!-- bean 子节点可以有多个 -->
<bean id="teacher" class="com.bw.dto.Teacher">
<!-- 属性的数据注入 -->
<!-- 构造方法数据注入 -->
<!-- 1.根据构造方法参数索引。索引从0开始 -->
<!-- 注入的数据类型要与构造方法参数类型匹配 -->
<constructor-arg index="0">
<value>110</value>
</constructor-arg>
<constructor-arg index="1">
<value>金腊梅</value>
</constructor-arg>
<constructor-arg index="2">
<value>30</value>
</constructor-arg>
<!-- 2.根据构造方法参数类型 -->
<constructor-arg type="java.lang.Integer">
<value>120</value>
</constructor-arg>
<constructor-arg type="java.lang.String">
<value>金宝宝</value>
</constructor-arg>
<constructor-arg type="java.lang.Integer">
<value>28</value>
</constructor-arg>
<!-- 1.基本类型数据的注入 -->
<!--
name:实体类的属性;此处的name属性值跟实体类中属性名可以不一致,建议一致
【注意】原因:底层实现原理
spring实现属性赋值是根据:name属性值(name="xxx")在当前<bean/>中寻找匹配setXxx();的方法名实现;并非匹配相应的实体类属性
1.xxx首字母大写:xxx → Xxx
2.在前面增加set:xxx → Xxx → setXxx()
3.依赖注入(赋值),<bean/>配置实体类中必须要有set方法
为属性赋值:value / ref
value:基本数据类型赋值;为在栈内存中的内存赋值
ref:引用数据类型赋值;为在堆内存中的内存赋值
-->
<property name="integer" value="1"></property>
<property name="tname" value="金腊梅"></property>
<property name="tage" value="30"></property>
<!-- 2.简单引用类型数据的注入 -->
<property name="student" ref="stu"></property>
<!-- 3.list集合数据的注入 -->
<!-- 注意:如果属性限定了泛型,那么必须同时在get,set方法也进行泛型限定,否则对数据注入无效 -->
<property name="list">
<!--
List集合泛型的限定:<list value-type="">
value-type="":指定List集合元素(泛型)类型
value-type="com.bw.dto.Student"
-->
<list>
<!-- 第一个元素注入:简单的数值 -->
<!-- 元素默认类型:type="java.lang.String" -->
<value>1</value>
<!-- 第二个元素注入:引入一个对象,已经在上下文配置的<bean id="" class=""/>对象 -->
<ref bean="stu"/>
<!-- 第三个元素注入:注入一个对象,可以同时进行实例化 -->
<!-- 注意:要么不注入某一个属性,默认为null;如果注入就要保证数据完整性,否则加载会报错 -->
<bean class="com.bw.dto.Student">
<property name="sid" value="1001"></property>
<property name="sname" value="任博文"></property>
<property name="age" value="30"></property>
</bean>
<!-- 第四个元素注入:双精度小数 -->
<!-- 手动指定注入元素数据类型:type="java.lang.Double" -->
<value type="java.lang.Double">333.3333</value>
</list>
</property>
<!-- 4.map映射数据的注入,类似List -->
<property name="map">
<!--
map映射键-值对泛型的限定:<map key-type="" value-type="">
key-type="":指定map映射"键"的(泛型)类型
value-type="":指定map映射"值"的(泛型)类型
-->
<map>
<!--
key:键注入,基本数据类型
value:值注入,基本数据类型
key-ref:键注入,引用数据类型;
value-ref:值注入,引用数据类型
key/value-ref:引入一个对象,已经在上下文配置的<bean id="" class=""/>对象
-->
<!-- 第一个"键-值"注入 -->
<entry key="key1" value="北京"></entry>
<!-- 第二个"键-值"注入 -->
<entry key="key2" value-ref="stu"></entry>
<!-- 第三个"键-值"注入 -->
<!-- 为值注入一个对象,可以同时进行实例化 -->
<entry key="key3">
<bean class="com.bw.dto.Student">
<property name="sid" value="1002"></property>
<property name="sname" value="西厂白公公"></property>
<property name="age" value="40"></property>
</bean>
</entry>
<!-- 第四个"键-值"注入 -->
<entry key-ref="stu" value-ref="stu2"></entry>
<!-- 第五个"键-值"注入 -->
<entry>
<!-- 为键注入一个对象,可以引入,也可以同时进行实例化 -->
<key>
<ref bean="stu"/>
</key>
<!-- 为值注入基本数据类型,默认为java.lang.String,可以手动指定数据类型 -->
<value type="java.lang.Integer">1002</value>
</entry>
</map>
</property>
<!-- 5.Properties属性集数据的注入 -->
<!--
Properties类表示了一个持久的属性集
底层是基于键-值对结构存储数据,要求键和值必须全部为java.lang.String类型
Properties类继承了Hashtable<Object,Object>类,所以可对Properties对象应用put和putAll方法,
但不建议使用这两种方法,因为他们允许键和值插入不是String类型的值。
相反,应该使用setProperty方法。如果在"有危险"的 Properties 对象(即包含非 String 的键或值)上调
用 store 或 save 方法,则该调用将失败。
1. Properties()
创建一个无默认值的空属性列表
2. Properties(Properties defaults)
创建一个带有指定默认值的空属性列表
4. Object setProperty(String key, String value)
调用 Hashtable的put()方法
5. String getProperty(String key)
用指定的键在此属性列表中搜索属性
6. String getProperty(String key, String defaultValue)
用指定的键在属性列表中搜索属性
7. void load(InputStream inStream)
从输入流中读取属性列表(键和元素对)
8. void store(OutputStream out, String comments)
以适合使用 load 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流
-->
<property name="properties">
<props>
<prop key="1001">人事部</prop>
<prop key="1002">企划部</prop>
<prop key="1003">销售部</prop>
</props>
</property>
</bean>
<bean id="stu" class="com.bw.dto.Student">
<property name="sid" value="1"></property>
<property name="sname" value="白伟东"></property>
</bean>
<bean id="stu2" class="com.bw.dto.Student">
<property name="sid" value="2"></property>
<property name="sname" value="任博文"></property>
</bean>
<!--
name:别名目标对象(对应id属性)
alias(别名):支持中文
-->
<!--【注意】为对象起别名,本质上还是同一个对象,同一个栈值!不再调用无参构造器,即不会再创建对象 -->
<alias name="teacher" alias="th"/>
<!-- 配置静态工厂创建对象 -->
<!--
factory-method:配置工厂类中静态方法,工厂类中若包含了很多静态方法,可选配置工厂类中具体静态方法。属性值:方法名
【注意】本质上这里是使用【类.静态方法】来创建返回一个Teacher类对象(teacher1)
工厂类调用静态方法:Teacher teacher1 = SpringFactory.getTeacher();
-->
<bean id="teacher1" factory-method="getTeacher" class="com.bw.dto.SpringFactory"></bean>
<!-- 配置简单工厂创建对象 -->
<!--
区别:与静态工厂不同,此处不能配置factory-method属性
理由:因为factory-method属性用来配置静态方法,而简单工厂不使用(类.静态方法)创建Teacher类对象,
而是先创建一个工厂对象,再由工厂对象创建实体类Teacher类对象
-->
<!-- 【注意】本质上这里此时只是创建了一个工厂类对象(normalFactory),并非Teacher类对象 -->
<bean id="normalFactory" class="com.bw.dto.SpringFactory"></bean>
<!--
id:Teacher类对象
factory-bean:引用简单工厂类对象
-->
<!--【注意】这里此时才会利用上面的创建的简单工厂类对象(normalFactory)来创建一个Teacher类对象 -->
<bean id="teacher2" class="com.bw.dto.Teacher" factory-bean="normalFactory"></bean>
</ beans >