问题
首先采用注解方式在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做的并不人性化,需要改进啊!
个人总结,仅供参考。