使用Spring时的多态问题

DryKillLogic 2009-08-07 09:09:22
使用Spring时,突然发现一个J2SE的困惑:
OrgManager是我定义的一个接口,OrgManagerImpl是他的实现类,在Spring中装配了OrgManagerImpl

<bean id="OrgManager" class="com.oa.manager.impl.OrgManagerImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>


通过测试程序取出OrgManagerImpl的实例:

OrgManager orgManager = (OrgManager)factory.getBean("OrgManager");

这样是可以的,测试也成功
但是如果强转成子类:OrgManagerImpl再赋值给OrgManager 就会出cast异常,不知道为什么??如下:

OrgManager orgManager = (OrgManagerImpl)factory.getBean("OrgManager");

这不就是多态的形式吗?而且OrgManager orgManager = new OrgManagerImpl();是可以的啊,难道上面的用法不符合多态吗?
...全文
285 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xtbzqw 2009-08-14
  • 打赏
  • 举报
回复
你这个事从父类强制转换为子类,它肯定会不通过啊!
Lucky丶華少灬 2009-08-14
  • 打赏
  • 举报
回复
1楼说的是正解确的,getBean()返回来的的确是一个代理类,可以把你的程序运行起来,然后设置一个断点,看一下getBean()返回来的值是什么?
好吃的松子 2009-08-14
  • 打赏
  • 举报
回复
1楼2楼正解
老紫竹 2009-08-13
  • 打赏
  • 举报
回复
OrgManager orgManager = (OrgManagerImpl)factory.getBean("OrgManager");


Spring 进行了代理,其已经不是什么Impl了,也没有去Extends 什么Impl.
所以...
sangshusen_1988 2009-08-07
  • 打赏
  • 举报
回复
不是赋值给它出的异常。是类型转换异常。

factory.getBean("OrgManager");获取的bean其实不是真正的OrgManagerImpl的实例,
而是生成的一个代理对象。spring的代理机制大致这样,如果这个类有实现的接口的话,就会使用
JDK的代理Proxy去生成代理对象,代理对象实现了OrgManager接口,它跟OrgManagerImpl实际上
最多算是兄弟关系,不存在继承关系。如果该类没有实现接口,spring会使用CGLIB去生成代理对象。

为什么会是代理对象呢,肯定是你使用了spring的事务管理,spring的事务管理是通过AOP去实现的,
所有会生成代理对戏那个

81,090

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧