Java自动装配
当我们的类中存在其他类的成员的时候,可以使用自动装配来自动进行实例化:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
package org.alextang.entity.student;
import org.alextang.entity.teacher.Teacher;
public class Student {
private Teacher teacher;
public void hello() {
System.out.println("Hello World!");
}
public void teach() {
teacher.teach();
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
}
|
使用autowire
的标签属性即可开启某个类的自动装配。其中分为byType
和byName
的两种值。
byType
可以根据依赖的类型找到适合的类进行实例化:
1
2
|
<bean name="programTeacher" class="org.alextang.entity.teacher.ProgramTeacher"/>
<bean name="Student" class="org.alextang.entity.student.ArtStudent" autowire="byType">
|
此时,Student
类会自动找到org.alextang.entity.teacher.ProgramTeacher
作为依赖注入。
如果有多个同样的类,那么这种byType
的方式便不再好用,此时可以使用byName
进行精确的定位。
byName需要同时修改set函数的名称
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class Student {
private Teacher teacher;
public void hello() {
System.out.println("Hello World!");
}
public void teach() {
teacher.teach();
}
public void setArtTeacher(Teacher teacher) {
this.teacher = teacher;
}
}
|
1
2
3
|
<bean name="programTeacher" class="org.alextang.entity.teacher.ProgramTeacher"/>
<bean name="artTeacher" class="org.alextang.entity.teacher.ArtTeacher"/>
<bean name="Student" class="org.alextang.entity.student.ArtStudent" autowire="byName">
|
此时就会自动寻找org.alextang.entity.teacher.ArtTeacher
作为依赖注入。
还可以使用constructer
为值进行依赖注入。此时需要指定有参的构造函数。
解决byType的冲突
当byType
选项拥有多个候选项的适合,可以主动排除一个候选项,使其精确选择。
使用autowire-candidate
设定为false
的适合,将排除该候选项。
1
2
3
|
<bean name="programTeacher" class="org.alextang.entity.teacher.ProgramTeacher"/>
<bean name="artTeacher" class="org.alextang.entity.teacher.ArtTeacher" autowire-candidate="false"/>
<bean name="Student" class="org.alextang.entity.student.ArtStudent" autowire="byType">
|
同时可以使用primary="true"
设置优先选择的一个类的实现。