3 回答
TA贡献1836条经验 获得超4个赞
改变
@Autowired
BCryptPasswordEncoder crypt;
到
@Autowired
PasswordEncoder crypt
或更改passwordEncoder方法
@Bean
BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
TA贡献1784条经验 获得超2个赞
如果你想知道
“没有合格的 bean 类型”的含义
从下面的代码
@Bean
PasswordEncoder passwordEncoder()
{
return new BCryptPasswordEncoder();
}
绝对 bean 是使用type名称 创建的。passwordEncoder PasswordEncoder
但
@Autowired
BCryptPasswordEncoder crypt;
上面的代码要求 spring 容器注入类型为 的 bean BCryptPasswordEncoder。
(注意:passwordEncoder bean 可能是 BCryptPasswordEncoder 的实例,但 bean 的类型为PasswordEncoder,因此没有类型的 bean BCryptPasswordEncoder)
因此异常
没有类型为“org.springframework.security.crypto.bcrypt”的合格bean。BCryptPasswordEncoder '可用
因此,您可以将 name 的 bean 自动装配passwordEncoder到 type 的字段PasswordEncoder。
@Autowired
PasswordEncoder crypt;
passwordEncoder您还可以从应用程序上下文中按名称获取 bean
@Autowired
ApplicationContext context;
inYourMethod()
{
PasswordEncoder crypt = context.getBean("passwordEncoder");
}
为了快速理解@Bean,@Autowired和@Qualifier简单的 6 个案例解释得很好
情况 1:创建的 bean 类型和 Autowired 字段的类型不同 - [这不起作用]
(没有可用的 BCryptPasswordEncoder 类型的合格 bean)
@Autowired
BCryptPasswordEncoder passwordEncoder;
@Bean
PasswordEncoder passwordEncoder()
{
return new BCryptPasswordEncoder();
}
情况 2:创建的 bean 类型和 Autowired 字段的类型相同 - [这不起作用]
@Autowired
PasswordEncoder passwordEncoder;
@Bean
PasswordEncoder passwordEncoder()
{
return new BCryptPasswordEncoder();
}
情况 3:自动装配字段的类型是创建的 bean 的超类型 - [这将起作用] 创建的 bean 是否属于 BCryptPasswordEncoder 类型 -
是 创建的 bean 是否属于 PasswordEncoder 类型 - 是
@Autowired
PasswordEncoder passwordEncoder;
@Bean
BCryptPasswordEncoder passwordEncoder()
{
return new BCryptPasswordEncoder();
}
情况 4:相同类型且没有 @Qualifier 的多个 bean - [这不起作用]
NoUniqueBeanDefinitionException:没有可用的“osscpPasswordEncoder”类型的合格 bean:预期有单个匹配 bean,但发现 2:bcryptPasswordEncoder、md4PasswordEncoder
@Autowired
PasswordEncoder bcrypt;
@Autowired
PasswordEncoder md4;
@Bean
public PasswordEncoder bcryptPasswordEncoder()
{
return new BCryptPasswordEncoder();
}
@Bean
public PasswordEncoder md4PasswordEncoder()
{
return new Md4PasswordEncoder();
}
案例 5:相同类型且带有 @Qualifier 的多个 bean - [这将起作用]
限定符有助于选择要注入的 bean
@Autowired
@Qualifier("bcryptPasswordEncoder")
PasswordEncoder bcrypt;
@Autowired
@Qualifier("md4PasswordEncoder")
PasswordEncoder md4;
@Bean
public PasswordEncoder bcryptPasswordEncoder()
{
return new BCryptPasswordEncoder();
}
@Bean
public PasswordEncoder md4PasswordEncoder()
{
return new Md4PasswordEncoder();
}
情况 6:相同类型的多个 bean,没有 @Qualifier,但字段名称与 bean 名称相同 - [这可行]
这里,字段名称充当限定符,当存在多个相同类型的 bean 时,它会有所帮助。
@Autowired
PasswordEncoder bcryptPasswordEncoder;
@Autowired
PasswordEncoder md4PasswordEncoder;
@Bean
public PasswordEncoder bcryptPasswordEncoder()
{
return new BCryptPasswordEncoder();
}
@Bean
public PasswordEncoder md4PasswordEncoder()
{
return new Md4PasswordEncoder();
}
TA贡献1799条经验 获得超9个赞
在 applicationContext.xml 中添加此行,以便开发人员使用 xml。
<bean id="bcrypt" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"></bean>
添加回答
举报