Spring 注入的对象到底是什么类型
开篇
之前,在用spring编码调试的时候,有时候发现被自动注入的对象是原始类的对象,有时候是代理类的对象,那什么时候注入的原始类对象呢,有什么时候注入的是代理类的对象呢?心里就留下了这个疑问。后来再次看spring aop的时候变有了大胆的想法。
案例
先添加springboot依赖
添加测试的类
添加Service1
添加Service2
添加Service3
Application
代码描述
添加了3个service,DemoService、*Demo2Service*是接口,有实现类。Demo3Service是没有接口,只有单一的类
Demo2Service和*Demo3Service* 的asyncDemo()方法上有@Async注解
CheckApplication方法上有 @EnableAsync,用来开启异步
运行结果
结果可以看出DemoService是被注入的是原始类的对象,Demo2Service被注入的对象是jdk代理的对象,Demo3Service被注入的对象是cglib的代理对象
将注入的demo2Service改为实现类注入
运行结果如下:
上面错误描述的是demo2ServiceImpl是实现Demo2Service接口的一个jdk动态代理,不能直接被注入
强制使用cglib
修改CheckApplication中的 @EnableAsync如下
运行结果如下:
上面结果是Demo2Service、*Demo3Service*被注入的都是cglib代理类
结论
spring很多功能都是通过aop来实现,如果事务,缓存注解,异步、还有一些自定义的aop等等,而aop是通过动态代理来实现的,spring主要用到的动态代理有jdk的动态代理和cglib。
Spring 在没有使用aop的时候自动注入的时候是原始类型对象
在发生aop的时候,若代理对象有实现接口,则默认会使用jdk动态代理
在发生aop的时候,若代理对象没有实现接口,则默认会使用cglib动态代理
jdk动态代理必须有实现接口
可以强制使用cglib来做spring动态代理
版权声明: 本文为 InfoQ 作者【JFound】的原创文章。
原文链接:【http://xie.infoq.cn/article/29ce37bd3f6f4c5b405549c06】。文章转载请联系作者。
评论