2017-06-06 6 views
1

私は私のプロジェクトで非常に奇妙なバグに出くわしました。私はcontext.getBean(Hello.class, "foo")を使用してオブジェクトをインスタンス化するとき、私はHelloクラスのBeanを取り戻す、次の二つのクラス春:nullを返す最終メソッドからのフィールドへのアクセス

@Component 
@Scope("prototype") 
public abstract class World { 
    String name; 

    public World(String name) { 
      this.name = name; 
    } 

    final void print() { 
      System.out.println(name); 
    } 
} 

@Component 
@Scope("prototype") 
public class Hello extends World { 

    public Hello(String name) { 
      super(name); 
    } 
} 

を持っていました。しかし、私がhello.print()になると、nullと表示されました。

最終変更を削除すると問題が解決しました。何が起きてる?春は最終的な方法に制限がありますか?

+0

抽象クラスから '@ Component'と' @ Scope'アノテーションを削除するとどうなりますか? –

+0

nope @NicoVanBelle doesnt work –

+0

Helloのコンストラクタに渡す値は何ですか? –

答えて

4

私は、CGLIBプロキシを使用することを前提としています。あなたは、その場合、春には

context.getBean(Hello.class, "foo").getClass() 

であることを確認することができますこんにちはのサブクラスを作成するCGLIBを要求します。そのサブクラスはHelloクラスの実際のインスタンスを取得します。これは、すべてのメソッドをオーバーライドすることを可能にして、最終的にターゲットを呼び出し、ここではそれは約どのように見えるかです:

class Proxy extends Hello { 
    Hello target; 

    void print() { 
    target.print(); 
    } 
} 

final Javaが上書き許可していないとして、あなたのメソッドをマークしているため。また、プロキシ自体(Helloのサブクラスである)は、nameフィールドが初期化されず、nullです。

実際のHello#print()メソッドは呼び出されません。Proxy#print()が呼び出され、Proxy#nameのみがnullになり、結果としてコンソールにnullが表示されます。

関連する問題