关于spring中不同包中类名相同报错问题的总结

 更新时间:2023年06月20日 10:13:32   作者:戴小码  
这篇文章主要介绍了关于spring中不同包中类名相同报错问题的总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

spring中不同包中类名相同报错问题

问题

首先采用注解方式在cn.zy.spring.anno包中创建UserDao类

Demo:

@Repository("userDao")
public class UserDao {
    public void add(){
        System.out.println("dao...");
    }
}

接着在cn.zy.spring.jdbcTemplate包中创建UserDao类,并增加findObjeect测试方法。

Demo:

@Component("userDao")
public class UserDao {
    public void find(){
        System.out.println("cn.zy.spring.jdbcTemplate的userDao");
    }
}

创建junit测试类:

Demo:

public class TestIOC {
    @Test
    public void testUser(){
        ApplicationContext application = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao = (UserDao) application.getBean("userDao");
        userDao.find();
    }

运行结果报错:

org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [applicationContext.xml]; nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'userDao' for bean class [cn.zy.spring.jdbcTemplate.UserDao] conflicts with existing, non-compatible bean definition of same name and class [cn.zy.spring.anno.UserDao]

分析原因

由于采用注解开发,虽然两个类在不同的包中,但是id却相同,这就会导致创建了两个相同的类,而spring是无法识别的。

解决办法

将其中一个UserDao类的注解的name属性改为其它值,只要不出现两个相同的name值就可以。

心得

我猜想在spring的beanFactory并没有对创建的对象进行按包分类,配置文件中配置的class属性只是为反射提供创建对象的路径而已。

beanFactory就像是一个对象池子,非常杂乱,在你加载spring的配置文件时,所有的对象及依赖关系都会被创建然后放在这个大池子中,使用的时候从里面取就可以了。

这点spring做的并不人性化,需要改进啊!

不同jar包类名相同怎么办呀?

如果你在同一个项目中使用了不同的 jar 包,其中有两个类名相同,那么这时候就需要用到类的全名(包括包名)。

例如,如果在你的项目中有两个包,一个是 com.example.package1,另一个是 com.example.package2,且两个包中都有一个类名为 MyClass,

那么你可以使用如下方式来区分这两个类:

com.example.package1.MyClass
com.example.package2.MyClass

也就是使用类的全名来区分它们。

如果你想在代码中使用这两个类,你可以这样写:

import com.example.package1.M

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java字符串相关类StringBuffer的用法详解

    Java字符串相关类StringBuffer的用法详解

    java.lang包下的StringBuffer类,代表着可变的字符序列,可以用来对字符串内容进行增删改操作。本文将通过示例详细说说它的用法,感兴趣的可以跟随小编一起学习一下
    2022-10-10
  • IntelliJ IDEA优化配置的实现

    IntelliJ IDEA优化配置的实现

    这篇文章主要介绍了IntelliJ IDEA优化配置的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Java程序执行时间的2种简单方法

    Java程序执行时间的2种简单方法

    这篇文章介绍了Java程序执行时间的2种简单方法,有需要的朋友可以参考一下
    2013-09-09
  • Java基础第四篇 封装与接口

    Java基础第四篇 封装与接口

    本文将对介绍Java 的封装与接口进行介绍,将要封装(encapsulation)对象的成员(成员包括数据成员和方法),从而只允许从外部调用部分的成员。利用封装,我们可以提高对象的易用性和安全性。想具体了解的小伙伴请参考下面文章的内容
    2021-09-09
  • Java使用阻塞队列控制线程通信的方法实例详解

    Java使用阻塞队列控制线程通信的方法实例详解

    这篇文章主要介绍了Java使用阻塞队列控制线程通信的方法,结合实例形式详细分析了java使用阻塞队列控制线程通信的相关原理、方法及操作注意事项,需要的朋友可以参考下
    2019-09-09
  • Java annotation元注解原理实例解析

    Java annotation元注解原理实例解析

    这篇文章主要介绍了Java annotation元注解原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Spring框架读取property属性文件常用5种方法

    Spring框架读取property属性文件常用5种方法

    这篇文章主要介绍了Spring框架读取property属性文件常用5种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • SpringBoot读取excel表格的示例代码

    SpringBoot读取excel表格的示例代码

    这篇文章主要介绍了SpringBoot读取excel表格的示例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • mybatis某些字段无法映射成功的解决

    mybatis某些字段无法映射成功的解决

    这篇文章主要介绍了mybatis某些字段无法映射成功的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Java静态代理和动态代理的深入讲解

    Java静态代理和动态代理的深入讲解

    这篇文章主要给大家介绍了关于Java静态代理和动态代理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04

最新评论