TODO 旧博客自动迁移数据到新博客,格式有些混乱,以后再整理格式

注入依赖对象可以采用手工装配自动装配,在实际应用中建议使用手工装配,因为自动装配会产生未知情况,开发人员无法预见最终的装配结果。

 

http://blog.csdn.net/konaji/article/details/52861599

 

spring支持5种自动装配模式,如下: 
1、no   ——默认情况下,不自动装配,通过“ref”attribute手动设定。

2、buName ——根据Property的Name自动装配,如果一个bean的name,和另一个bean中的Property的name相同,则自动装配这个bean到Property中。

3、byType   ——根据Property的数据类型(Type)自动装配,如果一个bean的数据类型,兼容另一个bean中Property的数据类型,则自动装配。

4、constructor ——根据构造函数参数的数据类型,进行byType模式的自动装配。

5、autodetect ——如果发现默认的构造函数,用constructor模式,否则,用byType模式。

第一种:no,默认情况下通过ref属性进行装配

<bean id="user4" class="com.bean.User">
        <property name="users" ref="userList"></property>
</bean>
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

第二种:byName,Spring会根据Bean中的属性名与XML配置文件中Bean的Id进行匹配,然后通过Set方法进行注入。

<bean id="teacher" class="com.bean.Teacher"></bean>
<bean id="student" class="com.bean.Student" autowire="byName"></bean>
  • 1
  • 2
  • 1
  • 2

下面这种情况是注入不进去的,因为Student中Teacher的属性叫teacher,与Bean的ID对应不上

<bean id="teacher_test" class="com.bean.Teacher"></bean>
<bean id="student" class="com.bean.Student" autowire="byName"></bean>
  • 1
  • 2
  • 1
  • 2

第三种:byType,Sprng会根据XML中配置的Bean的类型进行匹配,通过Set方法进行注入

<bean id="teacher" class="com.bean.Teacher"></bean>
<bean id="student1" class="com.bean.Student" autowire="byType"></bean>
  • 1
  • 2
  • 1
  • 2

但是如果配置了多个类型相同的Bean,会抛出异常,如下:

<bean id="teacher1" class="com.bean.Teacher"></bean>
<bean id="teacher2" class="com.bean.Teacher2"></bean>
<bean id="student1" class="com.bean.Student" autowire="byType"></bean>
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

第四种:constructor,Spring会根据类型相同的Bean通过构造方法public Student(Teacher teacher)将其注入,如果没有此构造,注入失败。

<bean id="teacher" class="com.bean.Teacher"></bean>
<bean id="student3" class="com.bean.Student" autowire="constructor"></bean>
  • 1
  • 2
  • 1
  • 2

constructor与byType一样,如果XML中出现了多个相同类型的Bean,则注入失败,抛出异常,如下:

<bean id="teacher" class="com.bean.Teacher"></bean>
<bean id="teacher2" class="com.bean.Teacher2"></bean>
<bean id="student3" class="com.bean.Student" autowire="constructor"></bean>
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

第五种:autodetect,Spring会先寻找Customer中是否有默认的构造函数,如果有相当于上边的’constructor’这种情况,用构造函数注入,否则,用’byType’这种方式注入,所以,此例中通过调用public Student(Teacher teacher)注入。

<bean id="teacher" class="com.bean.Teacher"></bean>
<bean id="student4" class="com.bean.Student" autowire="autodetect"></bean>
  • 1
  • 2
  • 1
  • 2

Java实体

public class Teacher {
@Override
<span class="hljs-keyword">public</span> String <span class="hljs-title">toString</span>() {
    <span class="hljs-keyword">return</span> <span class="hljs-string">"Teacher"</span>;
}

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
public class Student {
<span class="hljs-keyword">private</span> Teacher teacher;

<span class="hljs-keyword">public</span> <span class="hljs-title">Student</span>(Teacher teacher) {
    <span class="hljs-keyword">super</span>();
    <span class="hljs-keyword">this</span>.teacher = teacher;
}

<span class="hljs-keyword">public</span> <span class="hljs-title">Student</span>() {
    <span class="hljs-keyword">super</span>();
}

<span class="hljs-keyword">public</span> Teacher <span class="hljs-title">getTeacher</span>() {
    <span class="hljs-keyword">return</span> teacher;
}

<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setTeacher</span>(Teacher teacher) {
    <span class="hljs-keyword">this</span>.teacher = teacher;
}

<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> String <span class="hljs-title">toString</span>() {
    <span class="hljs-keyword">return</span> <span class="hljs-string">"Student [teacher="</span> + teacher + <span class="hljs-string">"]"</span>;
}

}