@bean和@Autowired实际如何工作?

时间:2018-12-12 14:00:42

标签: java spring

在我的配置中,我有这个:

   @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()方法。我已经搜索并阅读了很多教程和文章,但我不知道这是如何工作的。谁能解释?

3 个答案:

答案 0 :(得分:1)

查看此URL https://spring.io/guides/topicals/spring-security-architecture/ 似乎您在这里将WireManager AuthenticationManagerBuilder身份验证为@Bean。

配置(AuthenticationManagerBuilder auth),因此在这种情况下将可以使用,并且passwordEncoder也自动连接。

答案 1 :(得分:1)

似乎您使用的是Spring批注配置,

如果您不向方法或字段中添加Spring注释,则Spring不知道需要对其进行初始化,因此在Spring上下文中使用(也无需在Spring外部对其进行初始化)时,对象将为空

答案 2 :(得分:1)

出于安全原因,您需要避免以明文形式存储密码。基于此原理,您可以使用此选项对密码进行编码。

在您的示例中,您使用的是 PasswordEncoder 界面:

.passwordEncoder(passwordEncoder);

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

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

public PasswordEncoder passwordEncoderBean(){...

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