我用的是struts2 和 spring 框架,用的MVC,通过sping在ACTION在注入service,service中注入dao.其中service和dao都是一个接口,一个实现类。
现在我的问题是:我在声明的时候声明为什么类型?是接口 还是实现类?
也是是说,private UserService userService;还是private UserServiceImpl userService;区别就是一个声明为接口,一个声明为实现类,当然注入的时候都是注入实现类。
经过我的测试在service 里注入dao的时候声明为接口和实现类都行。但是在action中只能声明为接口,声明为实现类报“Bean property 'userService' is not writable or has an invalid setter method”类似的错误。
好像看过文章说,spring中默认的是声明为接口,可以改变配置文件改成实现类。但为什么在action中和service中不一样呢?
请指教,或者给出相关的文章,链接,谢谢

解决方案 »

  1.   

    这个问题很简单:在DAO和SERVICE中,我们所用到都是由SPRING帮我们生产的实体,这些实体在CONTENLENSERNE类统一放到了一个MAP中,而这个MAP仅仅装着我们需要使用的到类对象,而不是实体对象,在有请求的情况下,SPRING才根基XX.XML中的配置ID元素对MAP中的类对象进行匹配,匹配到了,那就通过放射进行实例化,然后放回这个类对象的实体给我们使用,但SPRING和STRUTS2的集成上和以往SPRING和STRUTS1的集成上有了很大区别。区别在于:1.SPRING和STRUTS1的集成,是通过组建扩张形式集成,基本没有IOC的方式进行,其含义并不属于IOC。2.SPRING和STRUTS2的集成,是通过了STRING对STRUTS2对内置接口进行推测,使得SPRINT能够对ACTIONSUUORT管理,从而得到对ACTION类对象的映射,但是SPRING不可能明白STRUTS2中的具体实现机制,所以SPRING只能对已在XX.XML中描述的ACTION取得ID元素后,在到MAP中需找匹配对象,但是这里找的不再是类对象,而是我们在XX.XML中描述的对象接口,这点是根据理式替换原则来实现的,这也是STRUTS2和SPRING中集成的一种“约定”.
      

  2.   

    楼上很详细。
    IOC推荐使用面向接口的编程,所以使用接口去声明
      

  3.   

    你重新生成一次就OK了
    在DAO和SERVICE中,我们所用到都是由SPRING帮我们生产的实体,这些实体在CONTENLENSERNE类统一放到了一个MAP中,而这个MAP仅仅装着我们需要使用的到类对象,而不是实体对象,在有请求的情况下,SPRING才根基XX.XML中的配置ID元素对MAP中的类对象进行匹配,匹配到了,那就通过放射进行实例化,然后放回这个类对象的实体给我们使用,但SPRING和STRUTS2的集成上和以往SPRING和STRUTS1的集成上有了很大区别。
      

  4.   


    首先谢谢你的解答,但是还有点疑问。
    1.在XX。XML中对ACTION,SERVICE的注入写法是一样的,都是指向一个实体类,为什么在SERVice中不采用接口的方式。
    2.接口注入应该是默认的方式,如果要改成类的注入方式,要怎么配置。
    3.您说的类对象和实体对象有什么区别?我不是太明白。
      

  5.   

    1.SPRING和STRUTS1的集成,是通过组建扩张形式集成,基本没有IOC的方式进行,其含义并不属于IOC。2.SPRING 和STRUTS2的集成,是通过了STRING对STRUTS2对内置接口进行推测,使得SPRINT能够对ACTIONSUUORT管理,从而得到对 ACTION类对象的映射,但是SPRING不可能明白STRUTS2中的具体实现机制,所以SPRING只能对已在XX.XML中描述的ACTION取得ID元素后,在到MAP中需找匹配对象,但是这里找的不再是类对象,而是我们在XX.XML中描述的对象接口,这点是根据理式替换原则来实现的,这也是 STRUTS2和SPRING中集成的一种“约定”.不错。很受用。
      

  6.   

    Spring入门 
    http://www.phome.asia/forum/thread/17029.html对Spring中接口注入的理解实例分析 :http://www.phome.asia/forum/thread/16341.html