zoukankan      html  css  js  c++  java
  • 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路径下前沿的位置。

    "作为一个成年人,只能允许自己以秒计算的情感流露。"

  • 相关阅读:
    Ubuntu 忘记root密码的解决方法
    zabbix 参数说明
    Python 进阶_OOP 面向对象编程_self 的实例绑定
    centos 6.5关闭NetworkManager
    本地yum源
    VMware通过VMnet8共享本地网络
    EasyUI之手风琴Accordion
    php 分页
    修改css
    /Home/Tpl/Equipment/rangeIndex.html 里调用魔板
  • 原文地址:https://www.cnblogs.com/yanggb/p/10650256.html
Copyright © 2011-2022 走看看