为什么在业务层接口和实现类都可以注入,而大部分人选择接口而不选择实现类思考?

为什么在业务层接口和实现类都可以注入,而大部分人选择接口而不选择实现类思考?

首先说明,注入的对象确实为实现类的对象。(并不是实现类的代理对象,注入并不涉及代理)
如果只是单纯注入是可以用实现类接收注入对象的,但是往往开发中会对实现类做增强,如事务,日志等,实现增强的AOP技术是通过动态代理实现的,而spring默认是JDK动态代理,对实现类对象做增强得到的增强类与实现类是兄弟关系,所以不能用实现类接收增强类对象,只能用接口接收。如使用动态代理的话你尝试就会报错,不过应该不会需要这么做,使用接口本来就是解耦的,你直接用实现类接收注入对象岂不是失去了注入的意义。(为什么不直接new一个呢?)

接口封装方法,实现类实现细节,对于单一实现来说,无论注入接口还是实现类来说,都是可以的,没有关系,但是对于多实现(多态)来说,统一注入接口类型对于编译期来说是比较优雅的,写代码,看代码的人不需要过多注重细节,运行期,通过不同的注解注入对应的实现类,达到多态的目的。
比如说接口Test,实现类AppleTest,BananaTest,CatTest
@Resource
private Test appleTest;
@Resource
private Test bananaTest;
@Resource
private Test catTest;
这种写法相对更优雅一点