2016-07-20 4 views
8

スプリングブーツのアノテーション@Autowiredが正しく機能するか分かりません。ここでは簡単な例です:スプリングブートについて@Autowired

@SpringBootApplication 
public class App { 
    @Autowired 
    public Starter starter; 

    public static void main(String[] args) { 
     SpringApplication.run(App.class, args); 
    } 
    public App() { 
     System.out.println("init App"); 
     //starter.init(); 
    } 
} 

- 私はこのコードを実行すると

@Repository 
public class Starter { 
    public Starter() {System.out.println("init Starter");} 
    public void init() { System.out.println("call init"); } 
} 

、私はログinit Appinit Starterを取得するので、春には、このオブジェクトを作成します。しかし、からAppにinitメソッドを呼び出すと、私はNullPointerExceptionとなります。オブジェクトを初期化するために、注釈@Autowiredを使用してさらに必要なものはありますか?

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'app': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [{package}.App$$EnhancerBySpringCGLIB$$87a7ccf]: Constructor threw exception; nested exception is java.lang.NullPointerException 
+0

をあなたのBeanのスコープに応じて、春理由ブートアプリケーションはパッケージスキャンを使用するようにあらかじめ設定されていますが、春は使用したいBeanのインスタンスを作成します。しかし、作成されたという理由だけで、必ずしも注入されたわけではありません。 – christopher

答えて

12

あなたはクラスAppのコンストラクタからinitメソッドを呼び出すと、春はまだAppオブジェクトに依存関係をautowiredていません。あなたは春がAppオブジェクトを作成し、オートワイヤリングを終了した後に、このメソッドを呼び出したい場合は、例えば、これを行うには@PostConstructアノテーションでメソッドを追加します。

@SpringBootApplication 
public class App { 
    @Autowired 
    public Starter starter; 

    public static void main(String[] args) { 
     SpringApplication.run(App.class, args); 
    } 

    public App() { 
     System.out.println("constructor of App"); 
    } 

    @PostConstruct 
    public void init() { 
     System.out.println("Calling starter.init"); 
     starter.init(); 
    } 
} 
+0

それは理にかなっています。今、働いて、よかった。ですから、autowiredオブジェクトにアクセスするには、常に@PostConstructアノテーションを使用する必要があります。 –

+0

こちらもOliver Gierkesのブログ記事を参照してください:http://olivergierke.de/2013/11/why-field-injection-is-evil/ –

+0

@ daniel.eichtenコンストラクタインジェクションはフィールドインジェクションより優れていますが、しかし、それはこの質問に関するものとは別の問題です。 – Jesper

関連する問題