2017-04-14 2 views
0

コード:CommandLineRunnerと豆(春)私の質問が何であるか

@SpringBootApplication 
public class Application { 

    private static final Logger log = LoggerFactory.getLogger(Application.class); 

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

    @Bean 
    public Object test(RestTemplate restTemplate) { 
     Quote quote = restTemplate.getForObject(
       "http://gturnquist-quoters.cfapps.io/api/random", Quote.class); 
     log.info(quote.toString()); 
     return new Random(); 
    } 

    @Bean 
    public RestTemplate restTemplate(RestTemplateBuilder builder) { 
     return builder.build(); 
    } 

    @Bean 
    public CommandLineRunner run(RestTemplate restTemplate) throws Exception { 
     return args -> { 
      Quote quote = restTemplate.getForObject(
        "http://gturnquist-quoters.cfapps.io/api/random", Quote.class); 
      log.info(quote.toString()); 
     }; 
    } 
} 

私は春に非常に新しいです。 @Beanアノテーションは、オブジェクトがIoCコンテナに保存されていることを理解している限り、正しいですか?

もしそうなら、@Beanを集めた最初のメソッドはすべてそして次にが実行されますか?

私の例では、test()というメソッドを追加しました。これはrun()と同じですが、代わりにObject(Random())を返します。 結果は同じですので、CommandLineRunnerとObjectを使用しています。

CommandLineRunnerを返す理由、つまりrun()のような構文を使用する理由はありますか?

さらに、この時点では、メソッドをコンテナに移動する利点は今までわかりませんでした。なぜそれを実行しないのですか?

ありがとうございました!

答えて

2

@Configurationクラス(@SpringBootApplication@Configuration)は、豆が登録されている場所です。 @Beanは、Spring Beanを宣言するために使用されます。 @Beanで注釈を付けられたメソッドは、オブジェクト(Bean)を返す必要があります。デフォルトではSpring Beanはシングルトンなので、@Beanと注釈を付けたメソッドが実行され、値が返されると、このオブジェクトはアプリケーションの終わりまで存在します。

あなたの場合

@Bean 
    public Object test(RestTemplate restTemplate) { 
     Quote quote = restTemplate.getForObject(
       "http://gturnquist-quoters.cfapps.io/api/random", Quote.class); 
     log.info(quote.toString()); 
     return new Random(); 
    } 

これは名 'テスト' でタイプランダムのSシングルトンBeanを生成します。したがって、他の春の豆にそのタイプまたは名前のBeanを挿入しようとすると(たとえば@Autowire)、その値を取得します。あなたが正確に望む場合を除いて、これは@Bean注釈の有効な使用ではありません。

は、アプリケーションコンテキストをロードして起動した後にロジックを実行できるようにする特別なBeanです。それでここでrestTemplateを使用し、urlを呼び出して返された値を出力するのは理にかなっています。

以前は、Spring Beanを登録する唯一の方法はxmlでした。

<bean id="myBean" class="org.company.MyClass"> 
    <property name="someField" value="1"/> 
</bean> 

@Configurationクラスは、XMLファイルの等価であり、@Bean方法は<bean> xml要素の等価です。だから我々はこのようなxmlファイルとBean宣言していました。

したがって、Beanメソッドでロジックを実行しないようにして、オブジェクトの作成とそのプロパティの設定に固執することをお勧めします。

関連する問題