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路徑下前沿的位置。
"作為一個成年人,只能允許自己以秒計算的情感流露。"