首先一个接口,一个类实现了这个接口,Spring托管了这个类。当用
类名 对象=(实现类类型) new ClassPathXmlApplicationContext("applicationContext.xml").getBean(beanName);
接收的时候应该用接口接受吧。当初学的时候是。但是下面这个是我遇见的:
UserBizImpl users = (UserBizImpl) new ClassPathXmlApplicationContext(
"applicationContext.xml").getBean("UserBizImpl");这个是用实现类接收的。照样能用。我在另一个再用实现类接收的时候就汇报 转换类型失败。不能理解。
大虾,帮忙理解下吧。谢谢

解决方案 »

  1.   

    (UserBizImpl) new ClassPathXmlApplicationContext(
    "applicationContext.xml").getBean("UserBizImpl");
      

  2.   

    package com.qixuejia.adam.test;import org.springframework.beans.BeansException;
    import org.springframework.context.support.ClassPathXmlApplicationContext;import com.qixuejia.space.biz.NoticeBiz;
    import com.qixuejia.space.biz.impl.NoticeBizImpl;
    import com.qixuejia.space.entity.TNotice;public class test2 { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    try {
    NoticeBizImpl noticeBiz =(NoticeBizImpl)new ClassPathXmlApplicationContext("applicationContext.xml").getBean("NoticeBizImpl");
    TNotice notice = noticeBiz.findNoticeById(0);
    if (notice == null) {
    System.out.println("没有该数据。");
    }
    else{
    System.out.println(notice.getNoticeTime());
    }
    } catch (BeansException e) {
    // TODO Auto-generated catch block
    System.out.println(e.getMessage());
    }
    }}
    报错:
    Exception in thread "main" java.lang.ClassCastException: $Proxy43 cannot be cast to com.qixuejia.space.biz.impl.NoticeBizImpl
    at com.qixuejia.adam.test.test2.main(test2.java:18)
      

  3.   

    这个不可用,报类型转换错误
    <!--空间 - 通知内容依赖注入 -->
    <bean id="NoticeBizImpl" class="com.qixuejia.space.biz.impl.NoticeBizImpl">
    <property name="noticeDAO" ref="TNoticeDAO"></property>
    </bean>下面这个可用,
    <bean id="UserBizImpl" class="org.adam.biz.impl.UserBizImpl">
    <property name="userDAO">
    <ref bean="UsersDAO" />
    </property>
    </bean>
    说说哪里错啦?
      

  4.   

    com.qixuejia.space.biz.impl.NoticeBizImpl这个类实现接口没有
     实现的接口应该和 org.adam.biz.impl.UserBizImpl这个类的接口一样
      

  5.   

    不是这么理解的。com.qixuejia.space.biz.impl.NoticeBizImpl这个类和org.adam.biz.impl.UserBizImpl都有自己接口。而且他们都实现了接口,都被Spring托管啦。
    只是在Spring中取对象的时候一个会报转换失败。一个不失败。就像上面说的那样子。谢谢
      

  6.   

    这样 这是你原来的代码
    NoticeBizImpl noticeBiz =(NoticeBizImpl)new ClassPathXmlApplicationContext("applicationContext.xml").getBean("NoticeBizImpl");这么说吧,可不可以这样
      
    这里换成接口类型 noticeBiz =(这里换成接口类型)new ClassPathXmlApplicationContext("applicationContext.xml").getBean("NoticeBizImpl");
    问下 你这个类 <bean id="NoticeBizImpl" class="com.qixuejia.space.biz.impl.NoticeBizImpl">
    <property name="noticeDAO" ref="TNoticeDAO"></property>
    </bean>是接口还是 实现类????
      

  7.   

    换成接口是可以的。我想问的是NoticeBizImpl noticeBiz =(NoticeBizImpl)new ClassPathXmlApplicationContext("applicationContext.xml").getBean("NoticeBizImpl");
    为什么不可以。
    并且,上面的
    UserBizImpl users = (UserBizImpl) new ClassPathXmlApplicationContext(
    "applicationContext.xml").getBean("UserBizImpl");这个为什么可以。
    他们都是一样的实现自己的接口,一样的被Spring托管。一个可用一个不可用。
    你说的那个是实现类,带着Impl呢
      

  8.   

    不是吧,貌似托管的类 有接口的话 只能用接口接收吧。
    用实现类 接收 肯定不对,你看Spring原理了么?奇怪的是,我这个竟然可以运行。灰常郁闷。
    啊。。
      

  9.   

    你看看你的spring文件中,声明<bean id="NoticeBizImpl" class="com.qixuejia.space.biz.impl.NoticeBizImpl">
    <property name="noticeDAO" ref="TNoticeDAO"></property>
    </bean>
    中的TNoticeDAO这个DAO的名字对不对,还有你的实现类NoticeBizImpl是否有名字为noticeDAO的私有变量,并且名字要正确。否则就get不到。