程式碼改造引發的NoSuchBeanDefinitionException:no bean named 'XXXX' available問題解決方案

欽拆大仁發表於2019-03-22

前段時間專案掃描出現一些不合規範的地方,有類問題就是不能動態載入。於是在程式碼中就換了一個方式:直接從Spring獲得bean物件,然後通過getClass方法獲得類。專案是使用Springboot開發的。

 原來:

Class<? extends Object> clazz = Class.forName(className);

 現在:

Object bean = applicationContext.getBean(className);
Class<? extends Object> clazz = bean.getClass();

在後續的程式碼測試中出現好多no bean named 'XXXX' available的問題,總結了一下出現的問題:

1、className不是使用全類名例如:com.way.inter.impl.CalImpl,需要轉換成類名首字母小寫:calImpl。因為類交給spring管理的時候一般預設使用小寫的類名作為bean的id;

2、如果類名全部是大寫字母,Spring會直接使用類名作為id,所以類名必須規範使用駝峰結構,這樣有利於在程式碼中統一處理;

3、Component註解後使用value指定名稱,這樣也會影響bean的獲取。例如:@Component(value="CalureImpl");

4、類名命名不規範,使用$等特殊字元;

5、直接使用類介面的名稱獲取實現類的bean,並且介面沒有使用Component註解;

6、專案中存在重名的類也會影響bean的獲取。

相關文章