@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 编码接口。
我的配置:
@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 编码接口。