Spring的autowire byName无法按预期工作

时间:2017-09-10 17:21:51

标签: java spring autowired

Spring autowire byName无法按预期工作。

public class SpellChecker {
    public SpellChecker() {
        System.out.println("Inside SpellChecker constructor." );
    }

    public void checkSpelling() {
        System.out.println("Inside checkSpelling." );
    }
}

public class TextEditor {

       private SpellChecker spellChecker1;
       private String name;

       public void setSpellChecker( SpellChecker spellChecker1 ){
          this.spellChecker1 = spellChecker1;
       }
       public SpellChecker getSpellChecker() {
          return spellChecker1;
       }
       public void setName(String name) {
          this.name = name;
       }
       public String getName() {
          return name;
       }

   public void spellCheck() {
       System.out.println(" TextEditor name is " +name);
      spellChecker1.checkSpelling();
   }
}

public class TextEditorMain {

    public static void main(String args[]) throws InterruptedException{

        ApplicationContext context = new 
        ClassPathXmlApplicationContext("Beans.xml"); 
        TextEditor tEditor = (TextEditor) context.getBean("textEditor");
        tEditor.spellCheck();   
    }
}

Spring bean配置:

<bean id = "spellChecker1" class = "com.spring.beans.SpellChecker">
</bean>

<bean id = "textEditor" class = "com.spring.beans.TextEditor" autowire="byName">
   <property name = "name" value = "text1"/>
</bean>

当我将spellChecker1作为bean id时,它无效。以下是控制台o / p,

Inside SpellChecker constructor.
 TextEditor name is text1
Exception in thread "main" java.lang.NullPointerException
    at com.spring.beans.TextEditor.spellCheck(TextEditor.java:26)
    at com.spring.main.TextEditorMain.main(TextEditorMain.java:15)

Bean ID和引用名称都相同spellChecker1但仍无法正常工作。但奇怪的是,如果我将xml中的bean id从spellChecker1更改为spellChecker代码正在工作并在o / p下面提供,

Inside SpellChecker constructor.
 TextEditor name is text1
Inside checkSpelling.

那么当我使用spellChecker1时,为什么不添加依赖?

1 个答案:

答案 0 :(得分:4)

它实际上按设计工作。您的属性的名称为spellChecker而不是spellChecker1。您有一个名为spellChecker1字段

字段的名称与属性的名称不同。属性的名称由类上可用的getset方法定义。如果您有setSpellChecker(和相应的getter),则会有一个名为spellChecker属性

所有这些都记录在JavaBeans Specification(1998年的某处写的!)

  

基本上,属性是与bean相关联的命名属性,可以通过调用bean上的适当方法来读取或写入。因此,例如,bean可能具有表示其前景色的foreground属性。可以通过调用Color getForeground()方法读取此属性,并通过调用void setForeground(Color c)方法进行更新。

     

源自JavaBeans规范。