java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > spring中不同包中类名相同报错

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

作者:戴小码

这篇文章主要介绍了关于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

总结

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

您可能感兴趣的文章:
阅读全文