有个接口叫UserManager,它的实现类是UserManagerImpl。
配置文件中配置<bean id="userManager" class="com.Login.UserManagerImpl"/>。并且没有在配置文件中配置强制使用CGLIB。
但是我想问的是为什么在客户端运行时代码写成:
        UserManager userManager = (UserManager)beanFactory.getBean("userManager");就能正常运行。
但是写成
    UserManagerImpl userManager = (UserManagerImpl)beanFactory.getBean("userManager");
或者写成
         UserManager userManager = (UserManagerImpl)beanFactory.getBean("userManager");就是运行出错呢。
我已经实现UserManager这个接口了,就是没拿它创建对象为什么运行就出错了呢?
不是只要类实现了接口Spring就会自动用jdk的动态代理生成代理类吗?我实现了啊!!!

解决方案 »

  1.   

    貌似beanFactory生成的对象是实现了UserManager接口的一个新的类,或者说是UserManagerImpl的代理类,不是UserManagerImpl类型的,所以你第二句的声明和第三句的强转就会出问题,因为他们类型不一样
      

  2.   

    spring 会自动帮你创建实例 为什么还要自己去获取
      

  3.   

    应该是他认为你的beanFactory.getBean("userManager");是UserManager类型的,你要把它转换成UserManagerImpl类型的,它会认为是不安全的。
      

  4.   

    哈哈 我周日时用了整整一天时间看了源码,跟您说的很像,好像就是实现了同一接口的两个类(代理类和UserManagerImpl)不能互相转换。