1. 案例环境
1.1. 依赖
1 | <dependency> |
1.2. 编写Bean
1 | package bean; |
1 | package bean; |
2. 通过property标签注入
1 | <bean id="car" class="bean.Car"> |
3. 属性类型声明
3.1. value标签的type属性
关于数组、集合等容器元素的声明:
- 如果容器元素类型是Object,则使用value标签为元素赋值时,有必要指定type属性。若不指定,默认是String
- 如果容器元素类型不是Object,则不必使用type属性。Spring会自动判断类型
1 | <property name="arr"> |
3.2. 容器标签的key-type / value-type属性
array、list、set、props标签都有value-type属性,用来声明元素的类型1
2
3
4
5
6<!-- value-type: 统一声明数组元素的类型 -->
<array value-type="int">
<value>100</value>
<value>200</value>
<value>#{200 + 300}</value>
</array>
map可以声明key-type和value-type1
2
3
4<map key-type="int" value-type="java.lang.String">
<entry key="111" value="aaa" />
<entry key="222" value="bbb" />
</map>
4. null空引用注入
错误示例:value设置为”null”,这是字符串,而不是空引用1
2
3
4
5<bean id="car" class="bean.Car">
<!-- 字符串"null" -->
<property name="name" value="null"/>
<property name="price" value="5000.0" />
</bean>
正确示例:1
2
3
4
5
6<bean id="car" class="bean.Car">
<property name="name">
<null />
</property>
<property name="price" value="5000.0" />
</bean>
5. 有参构造方法注入
5.1. 方式1:constructor-arg指定name/value(最常用)
1 | <bean id="person" class="bean.Person"> |
5.2. 方式2:constructor-arg只指定value
1 | <bean id="person" class="bean.Person"> |
5.3. 方式3: constructor-arg指定value和type
1 | <bean id="person" class="bean.Person"> |
5.4. 方式4: constructor-arg指定index
1 | <bean id="person" class="bean.Person"> |
6. ref引用外部Bean组件
1 | <bean id="car" class="bean.Car"> |
编写测试方法,可以看到person的car1其实就是car组件,car1并没有创建新的对象1
2
3
4
5
6
7
8
public void testIoc() throws Exception {
ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = ioc.getBean("person", Person.class);
Car car = ioc.getBean(Car.class);
// 输出true。说明两个引用指向同一对象
System.out.println(person.getCar1() == car);
}
7. 引用内部Bean组件
1 | <bean id="person" class="bean.Person"> |