java不同的包下相同的类名的问题与解决办法

Java中的类以包进行分类组织,当程序中需要用到某个包下的类时,可以以该类的全限定名进行引用。这样,不同的包中的类就可以同名,不会产生混淆。

但是这样就可能导致引用的时候会产生一些问题。

第一个问题,是Spring中自动注入的问题。

Spring自动注入不同包下的相同类名的类会有点问题。

Spring并不支持不同包下的类名相同的设定。这是因为默认的Spring检索Bean的唯一id(@Service,@Component等注解中的name属性)为类名(Class Name),并不包含包名(Package Name)的信息。

解决的方式有两种:

1.对Bean进行显示命名,例如@Service("userService")。

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

1<bean class="com.yanggb.userService"> 2... 3</bean>

这样的话beanName就是类的完全名(PackageName + ClassName)了。

第二个问题,不同的jar里面相同的包名类名怎么去区别导入。

这个问题与标题不符,标题是不同的包,这里的问题是不同的jar,虽然跑题了,但是还是可以归类到这里。

具体问题是,如果两个jar包里面有相同的包,有相同的类名,如果同时引用了这两个jar,就可能会产生引用的类不对的问题。

要知道这个问题产生的原因,就要了解JVM加载的方法。JVM在加载包的时候,是按CLASSPATH的路径从上往下找,找到第一个后就将这个包引用。

这时如果包名和类名都相同,那么JVM就没法区分了。一般来说我们用的IDE都是会提示发生冲突而报错的,如果不报错的话,那么就只有第一个包被引入,即在CLASSPATH路径下排在前面的包,第二个包会在classLoader加载类的时候判断重复而忽略。

知道了JVM加载包的方法,那么解决问题就很容易了,只需要将需要引用包的jar放在前边就可以了,也就是说放在CLASSPATH路径下前沿的位置。

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

点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Java日期时间API系列31

  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前

MyBatis接口(Bean)与配置信息(Mapper)绑定

目的MyBatis的XML配置文件解析成JAVA类并在内存中存储,但是在程序运行时需要对应的类去调用,而相应的调用类还没有实例化,现在流行的都是使用Spring去管理需要的对象,Spring提供2种方式,分别为XML与注解。下面来分析调用类的实例化及与配置绑定。1XML方式<bean id"menuMapper" cl

MapperScannerConfigurer 作用详解

自动扫描将Mapper接口生成代理注入到Spring<!DAO接口所在包名,Spring会自动查找其下的类<beanclass"org.mybatis.spring.mapper.MapperScannerConfigurer"<propertyname"basePackage"va

Java中不同包下类与类之间的访问

Java中不同包下类与类之间的访问(1)我们多次使用一个带包的类,都需要加包的全路径,非常的麻烦,这个时候,Java就提供了导包的功能,提供了一个关键字import。(2)格式:import包名.包名....包名.类名;这种方式导入的是:到类的名称。另一种:imp

Java 包(package)

  Java包(package)  为了更好地组织类,Java提供了包机制,用于区别类名的命名空间。  包的作用  1把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。  2如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该