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的。







免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM