关于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
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。