web-dev-qa-db-fra.com

Différence entre @Bean et @Autowired

Pourquoi ne puis-je pas utiliser @Autowired dans ce cas?

@SpringBootApplication
public class Application {

    @Autowired
    BookingService bookingService;

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

mais peut utiliser @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");
    }
}

Les deux manières de générer BookingService ne sont-elles pas la même chose?

53
zhuochen shen

@Bean Et @Autowired Font deux choses très différentes. Les autres réponses ici expliquent un peu plus en détail, mais à un niveau plus simple:

  • @Bean Dit à Spring 'Voici une instance de cette classe, veuillez la garder et me la rendre lorsque je le demanderai'.

  • @Autowired Dit 'donnez-moi s'il vous plaît une instance de cette classe, par exemple, celle que j'ai créée avec une annotation @Bean Auparavant'.

Cela a-t-il du sens? Dans votre premier exemple, vous demandez à Spring de vous donner une instance de BookingService, mais vous n'en créez jamais une, donc Spring n'a rien à vous donner. Dans votre deuxième exemple, vous créez une nouvelle instance de BookingService, vous en parlez à Spring, puis, dans la méthode main(), vous le redemandez.

Si vous le souhaitez, vous pouvez supprimer les deux lignes supplémentaires de la deuxième méthode main() et combiner vos deux exemples comme suit:

@SpringBootApplication
public class Application {

  @Autowired
  BookingService bookingService;

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

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

Dans ce cas, l'annotation @Bean Donne à Spring le BookingService, et le @Autowired S'en sert.

Ce serait un exemple un peu inutile, puisque vous utilisez tout cela dans la même classe, mais cela devient utile si vous avez le @Bean Défini dans une classe et le @Autowired Dans un autre un.

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

Annoter @Bean n'enregistre le service que comme un haricot (sorte d'objet) dans le contexte d'application Spring. En termes simples, il ne s’agit que d’enregistrement et rien d’autre.

@Autowired
BookingService bookingService;

Annoter une variable avec @Autowired injecte un BookingService bean (objet) dans le contexte de l'application Spring.

(i.e) le haricot enregistré avec @Bean L'annotation sera injectée dans la variable annotée avec @Autowired.

J'espère que cela efface votre doute!

9
pmverma

excellente réponse par @DaveyDaveDave Dans l'exemple au lieu de

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

Vous pouvez utiliser les annotations @Service sur la classe BookingService.

5
Kris Swat

Voici un bon article sur l'annotation @Autowired: http://www.baeldung.com/spring-autowire

L'annotation @Autowired peut instancier vos injectables en définissant @ComponentScan ("namespace.with.votre.components.for.inject") sur la classe de configuration.

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

Tous les composants doivent être marqués par une annotation @Component. Il remplace l'annotation @Bean.

2
n0rtan

@Bean est juste pour que la définition de métadonnées crée le bean (équivalent à tag). @Autowired consiste à injecter la dépendance dans un bean (équivalent à la balise/attribut XML ref).

0
SARIKA