1
votes

Pourquoi passwordEncoder () est-il un @Bean?

Pourquoi passwordEncoder () est-il défini comme @Bean s'il est appelé directement en tant que fonction? Voici l'exemple dont je parle

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

user.setPassword(passwordEncoder.encode(accountDto.getPassword()));

https://www.baeldung.com/spring-security-registration-password-encoding-bcrypt

Ou j'ai vu des gens le faire sur auth.userDetailsService(customUserDetailsService).passwordEncoder(passwordEncoder());


2 commentaires

Je ne comprends pas complètement votre question, voulez-vous demander si nous pouvons utiliser le PasswordEncoder simplement en appelant la méthode, alors pourquoi nous devons le définir comme bean.


Oui, je ne comprends pas pourquoi l'annotation @Bean est utilisée


3 Réponses :


2
votes

L'annotation

@Bean peut apparaître sur la méthode, c'est une possibilité d'enregistrer des beans. De cette façon, BeanFactory est conscient de ce bean et le qualifie avec un nom dérivé du nom de la méthode ( "passwordEncoder" ). Une autre façon serait de les nommer explicitement:

 @Bean({"b1", "b2"}) // bean available as 'b1' and 'b2', but not 'myBean'
 public MyBean myBean() {
     // instantiate and configure MyBean obj
     return obj;
 }

Consultez le javadoc pour plus d'informations.

Edit: dans l'exemple, @Bean est défini pour lier l'abstraction PasswordEncoder à l'implémentation BCryptPasswordEncoder . Sinon, Spring ne saurait pas quelle est la classe concrète s'il y en avait plus dans le scan.


5 commentaires

Qu'entendez-vous par «lier l'abstraction PasswordEncoder à l'implémentation BCryptPasswordEncoder»?


BCryptPasswordEncoder implémente PasswordEncoder , mais il pourrait y avoir une autre classe, qui fait cela, disons Banana - sans cette définition, comment le printemps saurait-il quoi prendre - BCryptPasswordEncoder ou Banana si vous écrivez @Autowired PasswordEncoder ?


Je n'ai pas écrit @Autowired PasswordEncoder, passwordEncoder () n'est-il pas juste un simple appel de fonction qui renvoie un nouvel objet de type BCryptPasswordEncoder qui implémente PasswordEncoder?


Vous pouvez l'utiliser de cette façon, vous pouvez également effectuer un câblage automatique. Vous connaissez l'injection de dépendance? Si vous l'appelez comme méthode, vous n'en avez pas besoin.


Oh ouais je vois maintenant que c'est @Autowired dans cet exemple, mon mauvais. ce qui m'a dérangé, ce sont ces tutoriels où l'encodeur de mot de passe n'est pas injecté, il vient d'être appelé comme méthode javaguides.net/2018/09/... javainuse.com/spring/boot_security_jdbc_authentication_bcryp‌ t



0
votes

L'annotation @Bean est utilisée pour enregistrer n'importe quel objet / méthode dans le conteneur Spring en tant que Bean.

Dans votre problème d'utilisation de la méthode passwordEncoder () comme bean, elle est marquée avec l'annotation @Bean afin qu'elle puisse être facilement injectée dans d'autres objets et utilisée.


1 commentaires

Je ne vois pas où il est injecté, c'est juste appelé comme méthode



0
votes

Vous devez en savoir plus sur injection de dépendances , DI est un modèle qui résout de nombreux les problèmes, en particulier lorsqu'ils sont utilisés avec Program to Interface , dans ce cas, si vous n'écrivez pas @Bean , cela le forcerait à créer plusieurs instances de BCryptPasswordEncoder à chaque fois que vous appelez la méthode. Alors que si vous écrivez @Bean , l'instanciation et la gestion du cycle de vie du bean sont gérées par le Spring Container , ce qui garantit à nouveau qu'une seule instance est créée en raison de Singleton étant la portée par défaut au printemps. Cliquez ici pour en savoir plus sur motif singleton .


0 commentaires