3 回答

TA貢獻1836條經(jīng)驗 獲得超4個贊
改變
@Autowired
BCryptPasswordEncoder crypt;
到
@Autowired
PasswordEncoder crypt
或更改passwordEncoder方法
@Bean
BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}

TA貢獻1784條經(jīng)驗 獲得超2個贊
如果你想知道
“沒有合格的 bean 類型”的含義
從下面的代碼
@Bean
PasswordEncoder passwordEncoder()?
{
? ? return new BCryptPasswordEncoder();
}
絕對 bean 是使用type名稱 創(chuàng)建的。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:創(chuàng)建的 bean 類型和 Autowired 字段的類型不同 - [這不起作用]
(沒有可用的 BCryptPasswordEncoder 類型的合格 bean)
@Autowired
BCryptPasswordEncoder passwordEncoder;
@Bean
PasswordEncoder passwordEncoder()?
{
? ? return new BCryptPasswordEncoder();
}
情況 2:創(chuàng)建的 bean 類型和 Autowired 字段的類型相同 - [這不起作用]
@Autowired
PasswordEncoder passwordEncoder;
@Bean
PasswordEncoder passwordEncoder()?
{
? ? return new BCryptPasswordEncoder();
}
情況 3:自動裝配字段的類型是創(chuàng)建的 bean 的超類型 - [這將起作用] 創(chuàng)建的 bean 是否屬于 BCryptPasswordEncoder 類型 -
是 創(chuàng)建的 bean 是否屬于 PasswordEncoder 類型 - 是
@Autowired
PasswordEncoder passwordEncoder;
@Bean
BCryptPasswordEncoder passwordEncoder()?
{
? ? return new BCryptPasswordEncoder();
}
情況 4:相同類型且沒有 @Qualifier 的多個 bean - [這不起作用]
NoUniqueBeanDefinitionException:沒有可用的“osscpPasswordEncoder”類型的合格 bean:預期有單個匹配 bean,但發(fā)現(xiàn) 2:bcryptPasswordEncoder、md4PasswordEncoder
@Autowired
PasswordEncoder bcrypt;
@Autowired
PasswordEncoder md4;
@Bean
public PasswordEncoder bcryptPasswordEncoder()?
{
? ? return new BCryptPasswordEncoder();
}
@Bean
public PasswordEncoder md4PasswordEncoder()?
{
? ? return new Md4PasswordEncoder();
}
案例 5:相同類型且?guī)в?@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條經(jīng)驗 獲得超9個贊
在 applicationContext.xml 中添加此行,以便開發(fā)人員使用 xml。
<bean id="bcrypt" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"></bean>
添加回答
舉報