用@Autowired的时候,到底是写接口的名字还是实现类的名字呢?

来源:4-2 Spring Bean装配之Autowired注解说明-1

慕斯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。

可以老师的例子是用接口名字的,  有其他规则?  

写回答 关注

2回答

  • YoungFFan
    2018-10-22 16:55:51

    这个其实是创建了实现类的对象但引用了接口类型,即"InjectionDao injectionDao = new InjectionDaoImpl()", 这个其实是Java多态性(向上转型)的一种应用。在实现类处加@Repository注解,意思就是new InjectionDaoImpl(), 而在InjectionServiceImpl中定义属性InjectionDAO injectionDAO就是将new出来的这个InjectionDaoImpl对象向上转型为InjectionDao类型。

  • 慕斯2064778
    2018-05-30 00:11:40

    自问自答一下,查完资料,@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名字不是首字母小写,而是大写.......


    慕娘6527...

    我自己写的时候也碰到奇怪的问题,最开始没有写默认构造器导致出现不能实例化这个service类,后来加上默认构造方法,没有setter方法,也没有含参构造方法,居然能把属性给赋值上去,确实挺强大的。联想下之前的byType、byName、constructor,这个autowired应该是综合了三种方法。并且这个三种方法实现和setter和构造器注入是不一样的,否则没有setter没有含参构造器,autowired还能注入,肯定是因为byType和构造器与setter注入是不一样的方法

    2018-09-20 20:24:22

    共 1 条回复 >

Spring入门篇

为您带来IOC和AOP的基本概念及用法,为后续高级课程学习打下基础

268787 学习 · 963 问题

查看课程

相似问题