2017-09-10 9 views
1

Spring autowire byNameが期待どおりに動作しません。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の設定:私は豆のIDとしてspellChecker1与えるとき

<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> 

それが機能していません。以下は

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) 

はビーンIDと参照名の両方が同じ spellChecker1が、まだ働いていない、コンソールO/Pです。私は spellChecker1を使用していたときに、依存関係が追加されていない理由しかし、奇妙なことがそう

Inside SpellChecker constructor. 
TextEditor name is text1 
Inside checkSpelling. 

、私はspellChecker1からspellCheckerにXMLで豆のIDを変更した場合、コードが動作し、O/Pの下に与えているのですか?

+0

依存関係を宣言していないため、あなたはセッターを作成しました。 –

+1

**フィールド**の名前は**プロパティ**の名前と同じではないためプロパティ名は、フィールドの名前ではなく、クラスのget/setメソッドによって定義されるため、プロパティ名は 'spellChecker'となります(これはSpringとは関係ありませんが、Java Bean仕様の動作/定義方法です)。だから実際には期待どおりに働いています。 –

答えて

3

実際には設計通りに動作します。 プロパティの名前はspellCheckerではなく、spellChecker1です。 フィールドの名前はspellChecker1です。

フィールドの名前は、プロパティの名前と同じではありません。プロパティの名前は、クラスで利用可能なgetsetのメソッドで定義されています。 setSpellChecker(および対応するゲッター)を持っているのでプロパティspellCheckerという名前があります。

このすべては、JavaBeans Specificationにダウン書かれている(1998年のどこかに書かれていた!)

基本的な特性は、Bean上の適切なメソッドを呼び出すことにより、読み取りや書き込みができるBeanに関連付けられた属性名前が付けられます。したがって、たとえば、Beanはその前景色を表す​​プロパティを持つことがあります。このプロパティは、Color getForeground()メソッドを呼び出すことによって読み取られ、void setForeground(Color c)メソッドを呼び出すことによって更新されます。

JavaBeans仕様のソースです。

+0

明確な説明のためにDeinumありがとうございます。分かりました。以前は、ファイル名とプロパティ名が同じであるという考えがありました。 – SuryaN

関連する問題