Java 通过getbean取出的类为什么要强转为接口类
这个问题是之前一个同学问我的,这些是我在网上找到的资料,由于我自己也没有完全搞明白,先大概记录一下
首先问题是为什么在bean文件中注入的是实现类,但是通过getBean()取出的时候却必须强制转化为接口类。
这个问题应该是和spring中配置的代理模式相关的,即到底是使用JDK动态代理还是Cglib代理。
关于代理模式这个问题spring的文档中这么写的:Spring AOP部分使用JDK动态代理或者CGLIB来为目标对象创建代理,如果被代理的目标对象实现了至少一个接口,则会使用JDK动态代理。所有该目标类型实现的接口都将被代理。若该目标对象没有实现任何接口,则创建一个Cglib代理。
简单来说,他们之间的区别就是:
- JDK动态代理的代理对象不需要实现接口,但是目标对象一定要实现接口
- 如果目标对象只是一个单独的对象,并没有实现任何的接口,这个时候就可以使用以目标对象子类的方式类实现代理,这种方法就叫做:Cglib代理
使用Cglib代理的时候,通过getBean()取出的注入对象既可以是普通对象,也可以是接口,通过JDK动态代理就只能使用接口。而一般代码习惯中使用JDK动态代理还是更常见的。
为什么通过JDK动态代理就只能使用接口?
如果只是单纯注入是可以用实现类接收注入对象的,但是往往开发中会对实现类做增强,如事务,日志等,实现增强的AOP技术是通过JDK动态代理实现的,而JDK动态代理对实现类对象做增强得到的增强类与实现类是兄弟关系,所以不能用实现类接收增强类对象,只能用接口接收。由于以上原因,如果将对象注入给实现类而非接口的话,在代理时就会报错。
Cglib代理类和实现类之间是父子关系,自然可以用实现类去接收代理类对象,但是一般这样做是没有意义的。
通常来说,由于java是面向对象的开发,JDK动态代理可以避免一些没有实现接口的对象代理,但是开发中有时候也会实现一些对象的注入(例如Util类),而Cglib刚好支持。
让Spring强制使用Cglib代理:
<aop:aspectj-autoproxy proxy-target-class="true"/>
关于java的三种代理模式,这里引用其他人的博客Java的三种代理模式
作者:岑宇
出处:http://www.cnblogs.com/cenyu/
如果有什么不对或者问题,欢迎指出
Java 通过getbean取出的类为什么要强转为接口类的更多相关文章
- c++怎么将一个类,拆分出接口类,和实现类
还拿上一遍中定义的GradeBook类来实现: #include <iostream> using std::cout; using std::endl; #include <str ...
- Python--抽象类接口类
一. 继承有两种用途: """ 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了 ...
- C++:如何正确的定义一个接口类
C++中如何定义接口类?首先给接口类下了定义:接口类应该是只提供方法声明,而自身不提供方法定义的抽象类.接口类自身不能实例化,接口类的方法定义/实现只能由接口类的子类来完成. 而对于C++,其接口类一 ...
- day24-抽象类与接口类
接口类 1.继承有两种用途:一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继 ...
- python之路----继承的抽象类和接口类
抽象类与接口类 接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数 ...
- Python抽象类和接口类
一.抽象类和接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名) ...
- [ python ] 接口类和抽象类
接口类 继承有两种用途:1. 继承基类的方法,并且做出自己的改变或者扩展(代码重用)2. 申明某个子类兼容于某基类,定义一个接口类interface,接口类定义了一些接口名且未实现接口的功能,子类继承 ...
- python开发面向对象基础:接口类&抽象类&多态&钻石继承
一,接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实 ...
- python's twenty-first day for me 抽象类和接口类以及多态
归一化设计: 不管是哪一个类的对象,都调用同一个函数去完成相似的功能. class Alipay: def pay(self,money): print('使用支付宝支付了%s' % money) c ...
随机推荐
- 大数据基础-2-Hadoop-1环境搭建测试
Hadoop环境搭建测试 1 安装软件 1.1 规划目录 /opt [root@host2 ~]# cd /opt [root@host2 opt]# mkdir java [root@host2 o ...
- 4.Centos7安装JDK8以及环境配置
1.下载 linux 版本 jdk (jdk-8u11-linux-x64.tar.gz) 一定要是 .tar.gz 版本,可以去我的百度网盘下载或者在百度上面找 2.新建文件夹命令:mkdir /u ...
- 使用Roslyn编译项目的示例
using System; using System.Collections.Generic; using System.IO; using Microsoft.CodeAnalysis; using ...
- Ubuntu 16.04 总出现红色圆圈警告和检测到系统程序出现问题
这种问题不可忽视!不可忽视!不可忽视!重要的事情说三遍!!!(一次死机,好多文件丢失,真是痛苦的经历) 自从从第三方安装了Python3.6,并将默认3.5改为3.6,导致ubuntu16.04右上角 ...
- XSS闯关游戏准备阶段及XSS构造方法
请下载好XSS闯关文件后,解压后放在服务器的对应文件夹即可 在该闯关中,会在网页提示一个payload数值 payload,翻译过来是有效载荷 通常在传输数据时,为了使数据传输更可靠,要把原始数据分批 ...
- Android WebView重定向问题的解决方案
当WebView在加载网页时,有时会有重定向问题,返回键回退怎么也回退不掉,怎么办? WebView有一个getHitTestResult():返回的是一个HitTestResult,一般会根据打开的 ...
- 批量检测服务器是否能telnet连通
# coding: UTF-8import osimport sysimport jsonimport platformfrom _utils.patrol2 import data_format,r ...
- Android屏幕旋转
一个手机最基本的旋转方向有上面4种,而在Android开发中,涉及到屏幕旋转的地方很多,而且各个函数给出的角度值都不一样,比如 Activity的getRotate,Camera的setDisplay ...
- 小程序引入百度api天气预报
先看下最终的效果(默认可以获得未来三天数据): 第一:首先准备条件(必须): 1.小程序已认证,有appID 2.必须把https://api.map.baidu.com 添加到小程序的合法域名列表中 ...
- 商品规格笛卡尔积PHP
<?php $color = array('red', 'green'); $size = array(39, 40, 41); $local = array('beijing', 'shang ...