开发过程中,我们有着约定优于配置的思想,Spring中的自动装配方式,就是这种思想的具现。
先提一下,简单类型不能自动装配!
主流的自动装配标识有如下三种:
①autowire="byName"(通过Bean的ID和引用类型的ref属性的对应来自动装配)
②autowire="byType"(通过Bean的类型(class)与该对应类的ref属性类型一致来自动装配)
③autowire="constructor"(通过有参构造方法中的参数列表中的ref属性和Bean的属性对应来自动装配)
具体的代码这样写:
为了说得详细一些,我下面多展示一些代码。
首先我们有两个类,一个Course一个Teacher:
Course.java
public class Course {
private String courseName;
private int courseHour;
//授课老师,依赖于Teacher类
private Teacher teacher;
public Course() {
}
public Course(String courseName, int courseHour, Teacher teacher) {
this.courseName = courseName;
this.courseHour = courseHour;
this.teacher = teacher;
}
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public int getCourseHour() {
return courseHour;
}
public void setCourseHour(int courseHour) {
this.courseHour = courseHour;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
public void showInfo() {
System.out.println(this.courseName+","+this.courseHour+","+this.teacher.getName());
}
}
Teacher.java
public class Teacher {
private String name;
private int age;
public Teacher() {
}
public Teacher(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
}
如果不用自动装配的话,在applicationContext.xml中我们应该这样写id为course的Bean:
<bean id="course" class="org.szh.entity.Course" >
<property name="courseName" value="java"></property>
<property name="courseHour" value="200"></property>
<property name="teacher" ref="teacher"></property>
</bean>
如果使用自动装配的话,我们只需这样写即可:
<bean id="course" class="org.szh.entity.Course" autowire="byName" >
<property name="courseName" value="java"></property>
<property name="courseHour" value="200"></property>
</bean>
通过这个byName,Spring会在org.szh.entity.Course里找到这个引用类型,然后在applicationContext.xml(也就是它自身)中找有没有id为teacher的Bean,显然是有的(代码如下):
<bean id="teacher" class="org.szh.entity.Teacher" p:age="24" p:name="lq">
</bean>
之后就可以实现自动装配了,而不用再去写这样一句话了。
-----------------------------------------------------------------------------------------------------------------------------------------------
当然一个个去在Bean里去配置autowire属性也够累,我们可以在配置头文件里加上这样一段代码来实现全局自动装配:
<beans
default-autowire="byName/byType/construction"//三选一
>
这样下面所有的Bean都会遵循你配置的标识来自动装配。
不过也有风险,比如有两个相同类型但不同id的Bean(byType用不了),或是相同id不同属性的Bean(byName用不了)
大家在使用时还需多加注意!