• 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路径下前沿的位置。

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

  • 相关阅读:
    个人阅读作业
    个人阅读作业3
    阅读作业中软件开发书籍阅读后的一些体会
    个人项目代码复审
    读《移山之道-VSTS软件开发指南》
    北航MOOC客户端
    个人阅读作业3
    个人阅读作业2
    代码互审
    结对编程项目总结以及一些小小的体会
  • 原文地址:https://www.cnblogs.com/yanggb/p/10650256.html
Copyright © 2020-2023  润新知