spring bean实现类

想请教下大佬一个问题,一个接口的实现类被装配为bean,为什么该接口能直接当作bean使用了呢?

子类拥有父类的所有方法,也就是一个子类可以当做父类开始用。其实不是接口能当做 bean 来用,而是子类的实例化对象可以向上转型而已。

如果你指的是在代码里使用这个bean的时候,声明的类型是接口,而不是直接使用这个类的话,是因为一个类实现了这个接口,就属于接口这个类型,比方说有个接口A,他有两个实现类B和C,那么 B instanceof A和C instanceof A的结果都是true,如果你是使用xml配置的bean,就很明显了,在配置bean的时候,class属性里填写的是实现类的class路径,由于spring默认的注入方式是按类型注入,当spring发现需要注入一个A类型的bean时,就会找一个属于A类型的bean注入,根据前面说的,B属于A类型,实际就会将A接口的实现类B注入,所以你代码里实际得到的对象是B,但是这样会有一个问题,如果你同时也配置了C,由于C也属于A类型,这个时候Spring不知道你要使用哪一个,这个时候就会报错存在重复的bean,同时,由于你是用接口声明的,在使用bean的时候,只能使用接口中定义的方法,如果B中除了接口的方法之外,还存在别的方法,是无法调用的,因为java把它当成了A类型,而A中没有声明这些方法。

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632