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强制使用Cglib代理:

<aop:aspectj-autoproxy proxy-target-class="true"/>

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

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

CGLIB(Code Generation Library)是一个开源项目!是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。

原文:https://www.cnblogs.com/lee10010/p/7888121.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Linyb极客之路

工作流引擎之activiti任务监听器

任务监听器只能添加到流程定义中的用户任务中。 注意它必须定义在BPMN 2.0 extensionElements的子元素中, 并使用activiti命名空间,...

40820
来自专栏java、Spring、技术分享

Netty 新连接的接入

本文通过源码分析Netty是如何一步步的将接收客户端的新连接,然后将连跟NioEventLoop绑定,并注册相应的Read事件。

23420
来自专栏大闲人柴毛毛

程序员必知的并发编程注意事项

获取单例对象需要保证线程安全,其中的方法也要保证线程安全。 单例对象会被多线程共享,因此要保证它是线程安全的,它其中的方法都要保证是线程安全的。 工具类、资源...

43750
来自专栏青玉伏案

PHP关于web页面交互内容

1. 学php学了有一段时间了总结总结给大家分享一下 2. PHP中的引用 第一段程序: <?php $first_name="fir...

30380
来自专栏菩提树下的杨过

hadoop:将WordCount打包成独立运行的jar包

hadoop示例中的WordCount程序,很多教程上都是推荐以下二种运行方式: 1.将生成的jar包,复制到hadoop集群中的节点,然后运行 $HADOOP...

46970
来自专栏开发与安全

linux系统编程之文件与I/O(三):目录的操作

一、目录的访问 功能说明:打开一个目录 原型:DIR*  opendir(char *pathname); 返回值: 打开成功,返回一个目录指针 打开...

18050
来自专栏爱撒谎的男孩

struts核心配置文件详解(result配置)

<package name="Login" extends="struts-default" namespace="/"> ​ <action name...

36650
来自专栏钟绍威的专栏

从源代码到Runtime发生的重排序编译器重排序指令重排序内存系统重排序阻止重排序

 源代码和Runtime时执行的代码很可能不一样,这是因为编译器、处理器常常会为了追求性能对改变执行顺序。然而改变顺序执行很危险,很有可能使得运行结果和预想的不...

30390
来自专栏张善友的专栏

在一个.net sln中包含多个project,project引用同一个dll导致的错误

在一个.net sln中包含多个project,其中四个project应用了同一个.net assamply:Lucene.Net。这四个project其中一个...

19370
来自专栏落影的专栏

为何百兆静态库能打进数兆的可执行文件?

前言 第三方库是工程开发必不可少的部分,而第三方库可以是.a和.framework的静态库,也可以是.framework的动态库,其中静态库是最常用的方式。 ...

56180

扫码关注云+社区

领取腾讯云代金券