先来个简单的例子//用户biz的接口
public interface IUsersBiz extends IBiz {
public Users login(Users users);
}//用户biz的实现类
public class IUsersBizImpl extends IBizProxy implements IUsersBiz {
public Users login(Users users) {
                 System.out.println("登陆");
}
spring配置注入bean <bean id="userBiz" class="fx.crm.biz.impl.IUsersBizImpl">
<property name="daoImpl" ref="daoImpl" />
</bean>
<bean name="/user" class="fx.crm.web.action.UserAction" parent="baseAction">
<property name="usersBiz" ref="userBiz" />
</bean>
UserAction里面这样写就没有问题private IUsersBiz userBiz;
但是改成这样声明的话tomcat启动就报错private IUsersBizImpl userBiz;
按道理讲IUsersBizImpl是IUsersBiz的实现类,用IUsersBiz声明没有问题,
但IUsersBizImpl同样也是IBizProxy的子类,为什么用IBizProxy声明就不行了,

解决方案 »

  1.   

    但是改成这样声明的话tomcat启动就报错 你的错误呢?最近总看到这样的提问。呵呵!
      

  2.   

    感觉楼主没有深入理解spring注入的原理```这里举个例子说说:当用MVC分层架构的时候,想要做到每层之间的无缝接藕(即真正做到面向接口编程),可以用spring管理每层的关系。比如说DAO层中,你可能用JDBC实现,可能用hibernate实现,但只要你定义好接口,无论用哪种实现,只要在spring改一下就能很方便地切换它的实现体了```而不需要改任何源码。在你这里,IUsersBiz是个接口,当你把UserAction改为:private IUsersBizImpl userBiz的话,这样还有意义吗???因为你这样定义的userBiz本身就是一个已知对象的引用(即IUsersBizImpl的一个对象),那么你这里的配置
    <bean id="userBiz" class="fx.crm.biz.impl.IUsersBizImpl">
        ...
    </bean>
    有何意义???当然这也肯定会出错```因为userBiz是已知一个对象的引用,这里spring再去配置它的实现,这不是多余了???所以在tomcat启动时会报错是正常的```(tomcat启动时会扫描spring的配置文件)
      

  3.   

    我想是楼上的这么仁兄误会两位前辈的意思了,呵呵!并不是他们不理解Spring注入的原理,而是你理解得太片面或者说太僵硬了诚然你说的大部分设计原理上架构的思想都是对的,这个大家也都知道,前面两位讨论的是Spring的注入实现上出现的奇怪现象。其实Spring的依赖注入并没有指定非要接口不可,举个例子:<property name="otherService" ref="otherService">private OtherServiceImpl otherService;这样也是可以的,Spring的依赖注入没有你想象的那么死板,它并不要求你注入的每个Bean都必须有接口,从本质上来说Spring只是想实现控制的反转而已。所以上面两位前辈说的现象问题跟你说的没有联系,我相信他们肯定也早就知道了你说的架构方面的考虑!至于我对这个现象的看法是:
    楼主您是不是在配置中对你的Bean时使用了AOP拦截机制,比如说你配置过事务管理或者自己添加过拦截器,再或者说你使用了动态代理。因为Spring默认的动态代理是使用JDK自带的,比如我们在对DAO添加事务管理的时候实际上Spring就对DAO启用了动态代理,而JDK动态代理的一大缺陷就是必须要求被代理的对象有至少一个接口,所以这个时候你使用实现类签名的话,Spring配置文件的解析是会报错的。除非我们使用另外一种方式:CGLIB代理,这种是不要求代理对象实现接口的,但并非Spring的默认方式。如果并无动态代理的介入,无论用实现类还是接口签名注入Spring都不会出问题,我已经试过了!
      

  4.   


        <bean id="userBiz" class="fx.crm.biz.impl.IUsersBizImpl">
            <property name="daoImpl" ref="daoImpl" />
        </bean>
        <bean name="/user" class="fx.crm.web.action.UserAction" parent="baseAction">
            <property name="usersBiz" ref="userBiz" />
        </bean>
    你这个配置不完整啊
      

  5.   

    我是楼主,3楼真是高手啊!,我确实对自己的Bean对象进行了自己定义的动态代理,
    我不让IUsersBizImpl继承IUsersBiz就没有问题,
    可以加你QQ吗?想详细的讨论下
      

  6.   

    呵呵,我们上班不能用QQ,你加我好友可以看见我QQ,下了班很欢迎技术交流阿,互相学习!