この場合@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つの方法は同じではありませんか?
@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
を定義すると便利になります。
@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
注釈付きの変数に注入されます。
これがあなたの疑念をクリアすることを願っています!
@DaveyDaveDaveによる素晴らしい回答例ではなく
@Bean
BookingService bookingService() {
return new BookingService();
}
BookingServiceクラスで@Serviceアノテーションを使用できます
@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アノテーションを置き換えます。
@Beanは、メタデータ定義がBeanを作成するためのものです(タグと同等)。 @Autowiredは、依存関係をBeanに挿入します(ref XMLタグ/属性に相当)。