基于XML的装配
Spring提供了2种基于XML的装配方式:设值注入(Setter Injection)和构造注入(Constructor Injection)。下面就讲解下如何在XML配置文件中使用这两种注入方式来实现基于XML的装配。
在Spring实例化Bean的过程中,Spring首先会调用Bean的默认构造方法来实例化Bean对象,然后通过反射的方式调用setter方法来注入属性值。因此,设值注入要求一个Bean必须满足以下两点要求:
● Bean类必须提供一个默认的无参构造方法。
● Bean类必须为需要注入的属性提供对应的setter方法。
使用设值注入时,在Spring配置文件中,需要使用<bean>元素的子元素<property>来为每个属性注入值;而使用构造注入时,在配置文件里,需要使用<bean>元素的子元素<constructor-arg>来定义构造方法的参数,可以使用其value属性(或子元素)来设置该参数的值。下面通过一个案例来演示基于XML方式的Bean的装配。
(1)在项目chapter02的src目录下,创建一个com.itheima.assemble包,在该包中创建User类,并在类中定义username、password和list集合三个属性及其对应的setter方法,如文件1所示。
文件1 User.java
1 package com.itheima.assemble;
2 import java.util.List;
3 public class User {
4 private String username;
5 private Integer password;
6 private List<String> list;
7 /**
8 * 1.使用构造注入
9 * 1.1提供带所有参数的有参构造方法。
10 */
11 public User(String username, Integer password, List<String> list) {
12 super();
13 this.username = username;
14 this.password = password;
15 this.list = list;
16 }
17 /**
18 * 2.使用设值注入
19 * 2.1提供默认空参构造方法 ;
20 * 2.2为所有属性提供setter方法。
21 */
22 public User() {
23 super();
24 }
25 public void setUsername(String username) {
26 this.username = username;
27 }
28 public void setPassword(Integer password) {
29 this.password = password;
30 }
31 public void setList(List<String> list) {
32 this.list = list;
33 }
34 @Override
35 public String toString() {
36 return "User [username=" + username + ", password=" + password +
37 ", list=" + list + "]";
38 }
39 }
在文件1中,由于要使用构造注入,所以需要其有参和无参的构造方法。同时,为了输出时能够看到结果,还重写了其属性的toString()方法。
(2)在com.itheima.assemble包中,创建配置文件beans5.xml,在配置文件中通过构造注入和设值注入的方式装配User类的实例,如文件2所示。
文件2 beans5.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://www.springframework.org/schema/beans
5 http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
6 <!--1.使用构造注入方式装配User实例 -->
7 <bean id="user1" class="com.itheima.assemble.User">
8 <constructor-arg index="0" value="tom" />
9 <constructor-arg index="1" value="123456" />
10 <constructor-arg index="2">
11 <list>
12 <value>"constructorvalue1"</value>
13 <value>"constructorvalue2"</value>
14 </list>
15 </constructor-arg>
16 </bean>
17 <!--2.使用设值注入方式装配User实例 -->
18 <bean id="user2" class="com.itheima.assemble.User">
19 <property name="username" value="张三"></property>
20 <property name="password" value="654321"></property>
21 <!-- 注入list集合 -->
22 <property name="list">
23 <list>
24 <value>"setlistvalue1"</value>
25 <value>"setlistvalue2"</value>
26 </list>
27 </property>
28 </bean>
29 </beans>
在上述配置文件中,<constructor-arg >元素用来定义构造方法的参数,其属性index表示其索引(从0开始),value属性用于设置注入的值,其子元素<list>来为User类中对应的list集合属性注入值。然后又使用了设值注入方式装配User类的实例,其中<property>元素用于调用Bean实例中的setter方法完成属性赋值,从而完成依赖注入,而其子元素<list>来同样是为User类中对应的list集合属性注入值。
(3)在com.itheima.assemble包中,创建测试类XmlBeanAssembleTest,在类中分别获取并输出配置文件中的user1和user2实例,如文件1所示。
文件1 XmlBeanAssembleTest.java
1 package com.itheima.assemble;
2 import org.springframework.context.ApplicationContext;
3 import
4 org.springframework.context.support.ClassPathXmlApplicationContext;
5 public class XmlBeanAssembleTest {
6 public static void main(String[] args) {
7 // 定义配置文件路径
8 String xmlPath = "com/itheima/assemble/beans5.xml";
9 // 加载配置文件
10 ApplicationContext applicationContext =
11 new ClassPathXmlApplicationContext(xmlPath);
12 // 构造方式输出结果
13 System.out.println(applicationContext.getBean("user1"));
14 // 设值方式输出结果
15 System.out.println(applicationContext.getBean("user2"));
16 }
17 }
执行程序后,控制台的输出结果如图1所示。
图1 运行结果
从图1可以看出,已经成功的使用基于XML装配的构造注入和设值注入两种方式装配了User实例。