java不同的包下相同的類名的問題與解決辦法


Java中的類以包進行分類組織,當程序中需要用到某個包下的類時,可以以該類的全限定名進行引用。這樣,不同的包中的類就可以同名,不會產生混淆。

但是這樣就可能導致引用的時候會產生一些問題。

第一個問題,是Spring中自動注入的問題。

Spring自動注入不同包下的相同類名的類會有點問題。

Spring並不支持不同包下的類名相同的設定。這是因為默認的Spring檢索Bean的唯一id(@Service,@Component等注解中的name屬性)為類名(Class Name),並不包含包名(Package Name)的信息。

解決的方式有兩種:

1.對Bean進行顯示命名,例如@Service("userService")。

2.使用XML的方式去聲明Bean。

<bean class="com.yanggb.userService">  
...  
</bean>  

這樣的話beanName就是類的完全名(PackageName + ClassName)了。

第二個問題,不同的jar里面相同的包名類名怎么去區別導入。

這個問題與標題不符,標題是不同的包,這里的問題是不同的jar,雖然跑題了,但是還是可以歸類到這里。

具體問題是,如果兩個jar包里面有相同的包,有相同的類名,如果同時引用了這兩個jar,就可能會產生引用的類不對的問題。

要知道這個問題產生的原因,就要了解JVM加載的方法。JVM在加載包的時候,是按CLASSPATH的路徑從上往下找,找到第一個后就將這個包引用。

這時如果包名和類名都相同,那么JVM就沒法區分了。一般來說我們用的IDE都是會提示發生沖突而報錯的,如果不報錯的話,那么就只有第一個包被引入,即在CLASSPATH路徑下排在前面的包,第二個包會在classLoader加載類的時候判斷重復而忽略。

知道了JVM加載包的方法,那么解決問題就很容易了,只需要將需要引用包的jar放在前邊就可以了,也就是說放在CLASSPATH路徑下前沿的位置。

 

"作為一個成年人,只能允許自己以秒計算的情感流露。"


免責聲明!

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



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