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?
@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.
@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!
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.
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.
@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).