[color=#FF0000][color=#FF0000]求解在UserServiceImpl注入UserDaoImpl
 private UserDao  userDaoImpl和     
 private  UserDaoImpl userDaoImpl 的区别?加入了aop的事务管理
[/color]

解决方案 »

  1.   

    求解在UserServiceImpl注入UserDaoImpl
     private UserDao  userDaoImpl和     
     private  UserDaoImpl userDaoImpl 的区别?加入了aop的事务管理
      

  2.   

    UserDao是接口,UserDaoImpl是接口的实现类。当然貌似你两种写法都是没有错的 但是一般都是
      private UserDao  userDaoImpl这样的吧,因为是引用接口。具体原因我也不知道了,地球人都这么写的!求真理..............
      

  3.   

     private UserDao  userDaoImpl和     
     private  UserDaoImpl userDaoImpl  你这样一来,你定义userDao干什么呢
      

  4.   

    咳……
    楼主,不知道有父类对象引用子类实现么?private UserDao userDaoImpl
    private UserDaoImpl userDaoImpl这两个的作用很类似,但最终的结果有差别。
    虽然变量的“名字”都是userDaoImpl,但是生成的类型是不同的:第一句生成的是UserDao类型;而第二句生成的则是UserDaoImpl类型。先解释下“父类对象引用子类实现”的概念。
    可以这样认为,父类的对象“范围”更大,父类的对象可以“接受”子类实例的引用。
    不管是extends出来的还是implements出来的,都是子类。这里我用extends举例。换成implements也是一样。
    先来看一个例子:
    现在有一个父类为public class 人类;
    第一个子类为public class 黄种人 extends 人类;
    第二个子类为public class 白种人 extends 人类;
    第三个子类为public class 黑种人 extends 人类;那么,在编程的时候可以这么来定义:
    private 人类 a = new 黄种人();
    父类是“人类”,明显范围更大。a的类型为“人类”,能接纳“黄种人”的实例引用。
    如果我们不想用黄种人的实例了,就可以直接换实例的实现,比如:
    private 人类 a = new 白种人();
    因为a的类型为“人类”,仍然能接纳“白种人”的实例引用。
    再打个比方:
    private 人类 a;
    此时没有new实例。此时a既可以指定为“黄种人”、“白种人”、“黑种人”其中的任意一种。然后是一个反例:
    private 黄种人 a = new 黄种人();
    要想修改程序变成这样:
    private 黄种人 a = new 白种人();
    这就明显不可能。 好了,我们再回到楼主的userDao上面来。
    现在有个userDao的父类:
    public interface userDao
    现在的程序用的是MySQL数据库,于是我们编写了个子类userDaoImpl4MySQL
    public class userDaoImpl4MySQL implements userDao那么,我们程序这么写,没问题:
    private userDaoImpl4MySQL u = new userDaoImpl4MySQL();但是,要是我们的数据库换了,改用Oracle了,我们编写了个子类userDaoImpl4Oracle
    private userDaoImpl4MySQL u = new userDaoImpl4Oracle();
    就不对了。但是要是用userDao对象,就不存在这样的问题:
    private userDao u = new userDaoImpl4MySQL();
    我们想改成userDaoImpl4Oracle,直接这样:
    private userDao u = new userDaoImpl4Oracle();
    假设:
    private userDao u;
    那么u既可以“接纳”userDaoImpl4MySQL(),又可以接纳userDaoImpl4Oracle();
    若是:
    private userDaoImpl4MySQL u;
    那么u就只能“接纳”userDaoImpl4MySQL了。在编程的时候,是由spring来注入“u”的。此时你怎么知道是注入的userDaoImpl4MySQL();还是userDaoImpl4Oracle();呢?因为数据库是可能被换,要是直接把“u”限死为userDaoImpl4MySQL()对象,比如:private userDaoImpl4MySQL u;
    这时候就只能注入userDaoImpl4MySQL对象了,要想注入userDaoImpl4Oracle对象就会出错。结论如下:
    这是一种“父类对象引用子类实现”的机制。
    可以认为父类范围更大,父类对象可以接纳不同的子类的实现。因为spring注入是可能发生变化的,所以使用范围更大的父类对象来承接。
      

  5.   

    在java里提倡面向抽象编程,而第一种就是面向抽象编程。楼主看看设计模式就知道了