使用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();是可以的啊,难道上面的用法不符合多态吗?

解决方案 »

  1.   

    不是赋值给它出的异常。是类型转换异常。factory.getBean("OrgManager");获取的bean其实不是真正的OrgManagerImpl的实例,
    而是生成的一个代理对象。spring的代理机制大致这样,如果这个类有实现的接口的话,就会使用
    JDK的代理Proxy去生成代理对象,代理对象实现了OrgManager接口,它跟OrgManagerImpl实际上
    最多算是兄弟关系,不存在继承关系。如果该类没有实现接口,spring会使用CGLIB去生成代理对象。为什么会是代理对象呢,肯定是你使用了spring的事务管理,spring的事务管理是通过AOP去实现的,
    所有会生成代理对戏那个
      

  2.   

    OrgManager orgManager = (OrgManagerImpl)factory.getBean("OrgManager");
    Spring 进行了代理,其已经不是什么Impl了,也没有去Extends 什么Impl.
    所以...
      

  3.   

    1楼说的是正解确的,getBean()返回来的的确是一个代理类,可以把你的程序运行起来,然后设置一个断点,看一下getBean()返回来的值是什么?