林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka
set注入和构造注入有时在做配置时比较麻烦。所以框架为了提高开发效率,提供自动装配功能,简化配置。Spring框架式默认不支持自动装配的,要想使用自动装配需要修改spring配置文件中<bean>标签的autowire属性。自动装配属性有5个值可选,分别代表不同的含义。
1、byName
从Spring环境中获取目标对象时,目标对象中的属性会根据名称在整个Spring环境中查找<bean>标签的id属性值。如果有相同的,那么获取这个对象,实现关联。
整个Spring环境:表示所有的spring配置文件中查找,那么id不能有重复的。
2、byType
从Spring环境中获取目标对象时,目标对象中的属性会根据类型在整个spring环境中查找<bean>标签的class属性值。如果有相同的,那么获取这个对象,实现关联。
缺点:如果存在多个相同类型的bean对象,会出错。
如果属性为单一类型的数据,那么查找到多个关联对象会发生错误。
如果属性为数组或集合(泛型)类型,那么查找到多个关联对象不会发生异常。
3、constructor(3.x以上已不能用)
使用构造方法完成对象注入,其实也是根据构造方法的参数类型进行对象查找,相当于采用byType的方式。如果没找到则抛出异常
4、autodetect
自动选择:如果对象没有无参数的构造方法,那么自动选择constructor的自动装配方式进行构造注入。如果对象含有无参数的构造方法,那么自动选择byType的自动装配方式进行setter注入。
5、no
默认情况下,不自动装配,通过“ref”attribute手动设定。<bean>标签的 autowire 属性,它负责自动装配<bean>标签定义 JavaBean 的属性。这样做可以省去很多配置 JavaBean 属性的标签代码,使代码整洁、美观。但是它也有负面影响,即使用自动装配之后,无法从配置文件中读懂 JavaBean 需要什么属性。自动装配存在很多不正确的装配问题,例如错误装载属性、“byType”属性和“constructor”属性对相同类型参数无法判断等。当然,将自动装配和手动装配混合使用也能解决此问题。下面通过一个实例来分析如何使用自动装配。
首先创建创建一个学生类 Student,定义学号、姓名、性别、年龄等属性,并添加对应的 set()与 get()方法。程序代码如下。
package com.autobean; public class Student { private String ID; private String name; private int age; private String sex; public String getID() { return ID; } public void setID(String iD) { ID = iD; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }同样创建一个教师类 Teacher,定义姓名、性别和年龄等属性,并添加对应的 set()与 get()方法。程序代码如下。
package com.autobean; public class Teacher { private String name; private int age; private String sex; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
创建教学档案类 TeachFile,定义 Teacher 和 Student 两个属性,并添加 print()方法。用于输出教师与学生的信息。程序代码如下。
package com.autobean; public class TeachFile { private Teacher teacher; private Student student; public TeachFile() { } public TeachFile(Teacher teacher, Student student) { this.teacher = teacher; this.student = student; } public Student getStudent() { return this.student; } public void setStudent(Student student1) { this.student = student1; } public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } public void print() { System.out.println("------教师信息------"); System.out.println("姓名:" + teacher.getName()); System.out.println("年龄:" + teacher.getAge()); System.out.println("性别:" + teacher.getSex()); System.out.println(); System.out.println("------学生信息------"); System.out.println("学号:" + student.getID()); System.out.println("姓名:" + student.getName()); System.out.println("年龄:" + student.getAge()); System.out.println("性别:" + student.getSex()); } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> <bean id="student" class="com.autobean.Student"> <property name="ID" value="80" /> <property name="name" value="阿王" /> <property name="age" value="23" /> <property name="sex" value="男" /> </bean> <bean id="teacher" class="com.autobean.Teacher"> <property name="name" value="何老师" /> <property name="age" value="43" /> <property name="sex" value="女" /> </bean> <!-- 默认情况下,通过‘ref’来装配bean --> <bean id="teachFile1" class="com.autobean.TeachFile" > <property name="teacher" ref="teacher" /> <property name="student" ref="student" /> </bean> <!--根据byName自动装配bean --> <bean id="teachFile2" autowire="byName" class="com.autobean.TeachFile" /> <!--根据byType自动装配bean --> <bean id="teachFile3" autowire="byType" class="com.autobean.TeachFile" /> <!--根据constructor自动装配bean --> <bean id="teachFile4" autowire="constructor" class="com.autobean.TeachFile"/> </beans>
package com.autobean; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; public class PrintInfo { public static void main(String[] args) { Resource res = new ClassPathResource("applicationContext.xml"); BeanFactory bf = new XmlBeanFactory(res); TeachFile tf1 = (TeachFile) bf.getBean("teachFile1"); TeachFile tf2 = (TeachFile) bf.getBean("teachFile2"); TeachFile tf3 = (TeachFile) bf.getBean("teachFile3"); TeachFile tf4 = (TeachFile) bf.getBean("teachFile4"); System.out.println("默认情况下,通过‘ref’来装配bean"); tf1.print(); System.out.println("根据byName自动装配bean"); tf2.print(); System.out.println("根据byType自动装配bean"); tf3.print(); System.out.println("根据constructor自动装配bean"); tf4.print(); } }
输出结果:
四月 02, 2015 8:16:48 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
默认情况下,通过‘ref’来装配bean
------教师信息------
姓名:何老师
年龄:43
性别:女
------学生信息------
学号:80
姓名:阿王
年龄:23
性别:男
根据byName自动装配bean
------教师信息------
姓名:何老师
年龄:43
性别:女
------学生信息------
学号:80
姓名:阿王
年龄:23
性别:男
根据byType自动装配bean
------教师信息------
姓名:何老师
年龄:43
性别:女
------学生信息------
学号:80
姓名:阿王
年龄:23
性别:男
根据constructor自动装配bean
------教师信息------
姓名:何老师
年龄:43
性别:女
------学生信息------
学号:80
姓名:阿王
年龄:23
性别:男
在上面实例的配置文件 appContext.xml 中,TeachFile 类采用4种装配,将 Teacher
类和 Student 类注入到对应的属性中。语法格式如下。
<bean autowire="byName" id="teachFile" class="TeachFile" />在 autowire 属性中指定类型为“byName”。autowire 属性共支持 5 种装配类型,下面
原文地址:http://blog.csdn.net/evankaka/article/details/44836069