web-dev-qa-db-ja.com

@Beanと@Autowiredの違い

この場合@Autowiredを使用できないのはなぜですか?

@SpringBootApplication
public class Application {

    @Autowired
    BookingService bookingService;

    public static void main(String[] args) {
        bookingService.book("Alice", "Bob", "Carol");
    }
}

ただし、@Beanを使用できます

@SpringBootApplication
public class Application {

    @Bean
    BookingService bookingService() {
        return new BookingService();
    }

    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(Application.class, args);
        BookingService bookingService = ctx.getBean(BookingService.class);
        bookingService.book("Alice", "Bob", "Carol");
    }
}

BookingServiceを生成する2つの方法は同じではありませんか?

53
zhuochen shen

@Bean@Autowiredは、2つの非常に異なることを行います。ここの他の回答では、もう少し詳細に説明しますが、より簡単なレベルです。

  • @Beanは、Springに「このクラスのインスタンスはここにあります。それを保持して、尋ねるときに返してください」と伝えます。

  • @Autowiredは、「このクラスのインスタンス、たとえば、以前に@Beanアノテーションで作成したものを教えてください」と言います。

それは理にかなっていますか?最初の例では、SpringにBookingServiceのインスタンスを提供するように要求していますが、インスタンスを作成することはないため、Springは提供するものがありません。 2番目の例では、BookingServiceの新しいインスタンスを作成し、Springにそのことを伝え、次にmain()メソッドでそれを要求します。

必要に応じて、2番目のmain()メソッドから追加の2行を削除し、次のように2つの例を組み合わせることができます。

@SpringBootApplication
public class Application {

  @Autowired
  BookingService bookingService;

  @Bean
  BookingService bookingService() {
    return new BookingService();
  }

  public static void main(String[] args) {
    bookingService.book("Alice", "Bob", "Carol");
  }
}

この場合、@BeanアノテーションはSpringにBookingServiceを与え、@Autowiredはそれを利用します。

同じクラスですべて使用しているため、これは少し無意味な例ですが、あるクラスで@Beanを定義し、別のクラスで@Autowiredを定義すると便利になります。

130
DaveyDaveDave
@Bean
BookingService bookingService() {
    return new BookingService();
}

@Beanに注釈を付けると、SpringアプリケーションコンテキストでサービスがBean(オブジェクトの種類)としてのみ登録されます。簡単に言えば、それは単なる登録であり、他には何もありません。

@Autowired
BookingService bookingService;

変数に@Autowiredアノテーションを付けると、Spring Application ContextからBookingService bean(i.e Object)が注入されます。

(i.e)@Bean注釈付きの登録済みBeanは、@Autowired注釈付きの変数に注入されます。

これがあなたの疑念をクリアすることを願っています!

9
pmverma

@DaveyDaveDaveによる素晴らしい回答例ではなく

@Bean
  BookingService bookingService() {
    return new BookingService();
  }

BookingServiceクラスで@Serviceアノテーションを使用できます

5
Kris Swat

@Autowiredアノテーションに関する良い記事を次に示します。 http://www.baeldung.com/spring-autowire

@Autowiredアノテーションは、設定クラスで@ComponentScan( "namespace.with.your.components.for.inject")を定義することにより、インジェクタブルをインスタンス化できます

@Configuration
@ComponentScan("com.baeldung.autowire.sample")
public class AppConfig {}

すべてのコンポーネントは@Componentアノテーションでマークする必要があります。 @Beanアノテーションを置き換えます。

2
n0rtan

@Beanは、メタデータ定義がBeanを作成するためのものです(タグと同等)。 @Autowiredは、依存関係をBeanに挿入します(ref XMLタグ/属性に相当)。

0
SARIKA