spring为什么是接口注入而不是实现类注入(持续更新)

关于spring注入这里,在开发过程中时常碰到,这里看到有人说的挺好的在这里做一下笔记。

这里虽是接口的注入但实际注入的对象是实现类的对象。如果只是单纯数据注入实现类是可以接收注入对象的,在开放中往往会对实现类增强,如事务、日志等,这些是通过AOP动态代理实现的。spring默认jdk动态代理,对实现类对象做增强得到的增强类与实现类是兄弟关系,所以不能用实现类接收增强类对象,只能用接口接收。

//接口:IA

//实现类:AImpl

//增强类:AImplProxy

AImpl aImpl = new AImpl();

//通过JDKProxyFactory创建代理对象
JDKProxyFactory factory = new JDKProxyFactory(aImpl);
AImplProxy aImplProxy = factory.createProxy();//这个增强类对象aImplProxy 只能强转为IA,而不能转为AImpl,因为JDK代理得到的AImplProxy类与AImpl是兄弟关系而非父子

 由于以上原因,如果将对象注入给实现类而非接口的话,在代理时就会报错。

你可能感兴趣的:(Spring框架)