使用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();是可以的啊,难道上面的用法不符合多态吗?
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();是可以的啊,难道上面的用法不符合多态吗?
而是生成的一个代理对象。spring的代理机制大致这样,如果这个类有实现的接口的话,就会使用
JDK的代理Proxy去生成代理对象,代理对象实现了OrgManager接口,它跟OrgManagerImpl实际上
最多算是兄弟关系,不存在继承关系。如果该类没有实现接口,spring会使用CGLIB去生成代理对象。为什么会是代理对象呢,肯定是你使用了spring的事务管理,spring的事务管理是通过AOP去实现的,
所有会生成代理对戏那个
Spring 进行了代理,其已经不是什么Impl了,也没有去Extends 什么Impl.
所以...