Spring'byName'中的自动装配不起作用

时间:2018-11-25 18:40:34

标签: java spring

我是Spring的新手。当前从xml配置开始,所以请不要说使用注释。 我在读有关自动装配'byName'的文章,我对它的工作方式感到困惑。

我的配置文件-

<bean name="StudentRepositor"
      class="com.sample.Repository.StudentRepositoryHibernate"/>

<bean name="StudentService"
      class="com.sample.Service.StudentServiceQuery" autowire="byName">
      <!--<property name="StudentRepositor" ref="StudentRepositor" />-->
</bean>

StudentServiceQuery类-

public class StudentServiceQuery implements StudentService {

private StudentRepository studentRepositor;
public void displayList() {

    List<Student> studentList = studentRepositor.returnList();
    System.out.println(studentList.get(0).toString());
}

public void setStudentRepositor(StudentRepository studentRepositor) {
    System.out.println("Dependency Injection - Setter");
    this.studentRepositor = studentRepositor;
}

}

Bean名称为“ StudentRepositor ”的类的名称为“ StudentRepository

  1. 当正确拼写bean名称(StudentRepository)时,自动装配正确工作。 setter方法为setStudentRepository,因此调用该方法进行setter注入。

  2. 当我拼写错误的bean名称(StudentRepositor)时,如果我使用property来引用该类,那么它将起作用。但是当我做“自动装配byName”时,它失败了。设置方法是setStudentRepositor

  3. byType自动装配每次都有效。

那么为什么自动装配byName会失败,如第2点所述。

1 个答案:

答案 0 :(得分:2)

在声明bean时:

<bean name="StudentRepositor"
      class="com.sample.Repository.StudentRepositoryHibernate"/>

bean的名称不应与类的名称相似,它可以是任何

将那些声明的bean注入另一个bean时:

  <bean name="StudentService"
          class="com.sample.Service.StudentServiceQuery" autowire="byName">
          <property name="StudentRepositor" ref="StudentRepositor" />
    </bean>

引用必须与您声明的Bean名称部分相同,因此,如果名称是StudentRepositor,则引用应相同(StudentRepositor)

对于注入时的属性名称,它应该与类中的属性名称相同

所以,如果您有这样的课程:

public class A{
 private StudentRepositor b;
}

您的xml文件中的属性名称应为“ b”:

 <bean name="StudentService"
              class="com.sample.Service.StudentServiceQuery" autowire="byName">
              <property name="b" ref="StudentRepositor" />
        </bean>