慕斯2064778
2018-05-29 23:06
有一点没明白,为什么注解@repository注解的是接口InjectionDAO的实现类InjectionDAOImpl,而在InjectionServiceImpl中定义的属性InjectionDAO injectionDAO自动装配,为什么最后得到的是InjectionDAOImpl的实例。
-----上面是某位同学的提问,我也有这样的疑问----
@Service注解服务层的时候,在unitest中,是从ApplicationContext.getBean("实现类名字,首字母小写") 这样获取的。
也就是说,在容器中初始化的Bean应该按照实现类名字规则。 这一点如果是用xml配置是不存在这样的问题,因为xml可以指定id, id 是接口,class指向实现类。
可以当老师讲 InjectionDAO 注入的时候,我以为也是需要 InjectionDAO injectionDAOImpl;这样来注入的,因为容器中存在的bean名字应该是@Repository注解的实现类,InjectionDAOImpl。
可以老师的例子是用接口名字的, 有其他规则?
这个其实是创建了实现类的对象但引用了接口类型,即"InjectionDao injectionDao = new InjectionDaoImpl()", 这个其实是Java多态性(向上转型)的一种应用。在实现类处加@Repository注解,意思就是new InjectionDaoImpl(), 而在InjectionServiceImpl中定义属性InjectionDAO injectionDAO就是将new出来的这个InjectionDaoImpl对象向上转型为InjectionDao类型。
自问自答一下,查完资料,@Autowired默认是按照byType查找,然后byType也不能说明直接查找到实现类呀。
Hmm,没有查到文档,我想在初始化容器的时候,扫面类的时候,容器也记下了每个类实现了哪些接口。 然后当你用接口的引用时,容器给你autowired一个实现类的实例了。 PS:当我创建了2个类,实现同一接口的时候,报错了。 发现有2个类实现同一接口,改从byName查找了
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.ken.study.spring_study.DAOSave] is defined: expected single matching bean but found 2: DAOSaveImpl,DAOSaveImpl2
这个时候呢,应该配合@Qualifier来用,存在多个实现类,可以指定名字,
不过比较有趣,看上面exception信息,这个时候用@Repository注解的DAO两个实现类,bean名字不是首字母小写,而是大写.......
Spring入门篇
268785 学习 · 963 问题
相似问题