1. ホーム
  2. java

[解決済み] Beanと@Autowiredの違いについて

2022-11-01 01:01:49

質問

なぜ @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");
    }
}

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

どのように解決するのですか?

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

  • @Bean はSpringに「ここにこのクラスのインスタンスがありますから、持っていてください。

  • @Autowired は『このクラスのインスタンスをください、例えば私が @Bean アノテーションで作成したものをください'と言っています。

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

もし望むなら、2 行目の追加行を削除して、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 を別のクラスで定義します。