@bean 和@Autowired 是如何工作的?

how @bean and @Autowired actually works?

我的配置:

   @Autowired
    private PasswordEncoder passwordEncoder;

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

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    // @Autowired
    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .userDetailsService(jwtUserDetailsService)
                .passwordEncoder(passwordEncoder);
    }

这段代码工作正常。但是如果我从 passwordEncoder 中删除 @Autowired,那么我必须在 configure 方法上添加 @Autowired。但此规则不适用于 authenticationManagerBean() 方法。谁能解释一下?

看看这个URLhttps://spring.io/guides/topicals/spring-security-architecture/ 看来您在这里将 AuthenticationManagerBuilder auth 自动连接为 @Bean。

Configure(AuthenticationManagerBuilder auth) 所以它会在这种情况下工作并且 passwordEncoder 也是自动装配的。

您似乎使用了 Spring 注释配置,

如果您不向方法或字段添加 Spring 注释,Spring 不知道它需要启动,因此在 Spring 上下文中使用时(也没有在 Spring 之外初始化它),对象将为 null

出于安全原因,您需要避免以明文形式存储密码。基于这个原则,你可以选择对你的密码进行编码。

在您的示例中,您使用的是 PasswordEncoder 接口:

.passwordEncoder(passwordEncoder);

使用这种方法,您必须通知一个实现。在 Spring 中,您可以使用 @Autowired 注入此实现(在声明中或类似于使用 PasswordEncoder 接口的方法上的代码)。

只是一个问题...您为什么要创建一个实现?

public PasswordEncoder passwordEncoderBean(){...

我认为这个方法可以替换为您的 Autowired 编码接口。