学科分类
目录
SSM框架

基于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实例。

点击此处
隐藏目录