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路径下前沿的位置。
"作为一个成年人,只能允许自己以秒计算的情感流露。"