`

spring为什么要注入接口,而不是实现类

 
阅读更多

转自:https://www.cnblogs.com/lee10010/p/7888121.html

 

首先说明,注入的对象确实为实现类的对象。(并不是实现类的代理对象,注入并不涉及代理)

  如果只是单纯注入是可以用实现类接收注入对象的,但是往往开发中会对实现类做增强,如事务,日志等,实现增强的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强制使用Cglib代理:

proxy-target-class="true"

  proxy-target-class在spring事务、aop、缓存这几块都有设置,其作用都是一样的。

cglib代理类和实现类之间是父子关系,自然可以用父类(实现类)去接收子类对象(代理类对象即增强类对象)。

不过应该不会需要这么做,使用接口本来就是解耦的,你直接用实现类接收注入对象岂不是失去了注入的意义。(为什么不直接new一个呢?)

分享到:
评论

相关推荐

    Spring_依赖注入_面向接口编程

    在Spring配置文件中,我们可以指定使用哪个实现类,并通过依赖注入将其注入到需要使用该服务的类中。这样,当我们需要更换服务实现时,只需更改配置,而无需修改调用者的代码。 在本项目"Spring_依赖注入_面向接口...

    Spring_依赖注入_面向接口编程_不同加载方式

    本项目以"Spring_依赖注入_面向接口编程_不同加载方式"为主题,旨在帮助初学者理解Spring的核心特性——依赖注入(Dependency Injection,简称DI),以及如何通过面向接口编程来提高代码的可维护性和可扩展性。...

    关于spring boot中几种注入方法的一些个人看法

    在 Spring Boot 中,注入是一种非常重要的机制,用于将 bean 对象注入到其他 bean 对象中,以便实现松耦合和高内聚的设计目标。下面我们将对 Spring Boot 中的几种注入方法进行详细的介绍和分析。 1. @Autowired @...

    Spring三种注入方式(三)

    Spring没有内置的接口注入机制,但可以通过实现`InitializingBean`或`DisposableBean`接口来自定义初始化和销毁逻辑。例如: ```java public class UserService implements InitializingBean { private ...

    spring依赖注入的实现原理

    Spring能够自动发现并管理标记为`@Component`及其子注解的类,省去了手动配置。 10. **装配(Wiring)** 装配是将Bean实例与它们的依赖关系连接起来的过程。Spring支持自动装配和基于XML或注解的显式装配。 ### ...

    Spring 三种依赖注入方式.doc

    在 Spring 中,我们可以通过定义一个接口,然后在实现类中实现该接口。例如,在上面的示例代码中,我们定义了一个 InterfaceB 接口,并在 ClassC 中实现了该接口。在 Spring 配置文件中,我们可以通过将 InterfaceB ...

    spring依赖注入底层详解

    3. 接口注入:Spring提供了一个SPI(Service Provider Interface)机制,允许通过实现特定接口并注入服务来实现依赖注入。这种方式在大型项目中常见,便于扩展和管理服务。 Spring依赖注入的底层实现主要依赖于反射...

    spring依赖注入例子

    Spring框架的依赖注入(Dependency Injection,简称DI)是其核心特性之一,它使得对象之间的关系在运行时由Spring容器管理,而不是硬编码在类内部。这样可以提高代码的可测试性和可维护性,因为对象的依赖关系变得松...

    Spring依赖注入使用构造设注入demo

    例如,我们可以有一个`Service`接口和它的实现类`ServiceImpl`: ```java public interface Service { void doSomething(); } public class ServiceImpl implements Service { @Override public void ...

    SpringIoc注入

    例如,如果有两个同名接口的实现类,那么必须使用`@Qualifier`来指定具体使用哪一个。 **五、XML配置文件中的注入** 在传统的Spring配置中,依赖注入是通过XML配置文件完成的。例如: ```xml ``` 这里,`...

    Spring 控制反转 依赖注入

    3. **接口注入**:较少使用,通过实现特定接口来注入依赖,但Spring并不直接支持,通常需要自定义实现。 **Spring的配置方式** Spring提供了多种配置方式: 1. **XML配置**:传统的Spring配置方式,通过`<bean>`...

    如何实现Spring依赖注入 AOP.rar

    在Spring框架中,DI主要通过构造器注入、setter方法注入和接口注入三种方式实现。 1. **构造器注入**:通过在类的构造器中传入依赖对象来实现。Spring会根据构造器参数类型找到合适的bean并注入。 ```java public ...

    spring为ApplicationContext提供的3种实现分别为:ClassPathXmlApplicationContext

    在 Spring 中,ApplicationContext 是一个至关重要的接口,它是应用上下文的实现,负责管理bean的生命周期和装配。标题提到的“ClassPathXmlApplicationContext”是 Spring 提供的三种 ApplicationContext 实现之一...

    Spring中的方法注入

    - **接口回调注入:** Spring框架还可以通过实现特定的回调接口并在运行时调用其方法来注入依赖。这种形式在处理动态行为或复杂逻辑时特别有用。 3. **使用`@PostConstruct`注解:** Spring提供了一个JSR-250规范...

    Spring的注入方式详解

    Spring 框架是 Java 开发中非常重要的一个组件,它提供了一种强大的依赖注入(Dependency Injection,简称 DI)机制,使得对象之间的依赖关系可以通过配置文件或者注解来管理,而不是硬编码在类的内部。这有助于提高...

    Spring依赖注入检查.

    Spring依赖注入是Spring框架的核心特性之一,它极大地简化了Java应用程序的开发,使得对象之间的依赖关系得以解耦,提高了代码的可测试性和可维护性。本文将深入探讨Spring依赖注入的概念、工作原理以及如何在实际...

    spring依赖注入

    这样,对象只需要声明它需要什么,而不是如何去获取。 在Spring中,依赖注入主要有三种方式:构造器注入、setter注入和接口注入。构造器注入是在对象实例化时通过构造函数传入依赖;setter注入则是通过调用对象的...

    Spring注入的方式

    而依赖注入则是将依赖关系的创建和管理交给外部容器,使得类只需要声明其依赖,而无需关心依赖的具体实现。 Spring提供了两种主要的依赖注入方式: 1. **构造器注入**: - 构造器注入是通过类的构造函数来注入...

    Spring三种注入方式(一)

    这种方式相对较少见,因为它增加了类的复杂性,使得类必须实现不必要的接口。但在某些场景下,如与AOP结合或处理多例bean时,接口注入可能是更合适的选项。 总结来说,Spring的三种注入方式各有优缺点。构造器注入...

Global site tag (gtag.js) - Google Analytics