Spring中默認bean名稱的生成策略/方式修改

Spring中默認bean名稱的生成策略/方式修改

最近公司項目打算模塊化,其實一個原因也是爲了能夠整合公司多個業務的代碼,比如一個資源xxx,兩個業務中都有對這個資源的管理,雖然是一個資源,但是是完全不同的定義、完全不同的表、不同的處理邏輯。所以打算把類名弄成一樣的,但是包名不一樣。

這裏就遇到一個問題,就是在使用註解的時候,兩個模塊裏的這個資源都叫xxxDao,這樣在spring啓動的時候就會報錯。錯誤如下conflicts with existing, non-compatible bean definition of same name and class [xxxxDao]什麼的,意思就是說兩個bean同名了,這樣啓動就報錯了。

解決方法只能咱們自己手動修改bean名稱的生成策略了,我這裏直接就是用他的實現類的全限定名稱(com.abc.dao.impl.xxxDaoImpl)來作爲bean的名稱了。

AnnotationBeanNameGenerator是spring的默認生成策略,我們看一眼源碼,其中buildDefaultBeanName方法是生成名稱的實現,具體如下:

String shortClassName = ClassUtils.getShortName(definition.getBeanClassName());
return Introspector.decapitalize(shortClassName);

這個默認的生成策略大家應該知道是怎麼生成的了,我就不細說了。

這裏definition.getBeanClassName()是獲取全限定名稱的,ClassUtils.getShortName是獲取類名的,下面的Introspector.decapitalize實際上就是把首字母變小寫的。

我們這裏要設置爲全限定名稱,我們可以新寫一個類,假設叫xxx,然後繼承AnnotationBeanNameGenerator之後重寫buildDefaultBeanName方法,返回definition.getBeanClassName(),這樣我們這個生成策略就寫好了。

接下來是需要在spring裏面配置一下。打開applicationContext.xml文件,找到我們配置context:component-scan這塊,增加一個參數name-generator=我們新寫的類的全限定名稱即可。

這時候所有bean的默認名稱就是我們設置的了,不過如果我們在類上顯式的寫了bean的id的話,還是會用我們自定義的bean的name的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章