日期:2014-05-17  浏览次数:20678 次

有关Spring的IOC注入问题,疑问多多。求真相
[color=#FF0000][color=#FF0000]求解在UserServiceImpl注入UserDaoImpl
 private UserDao  userDaoImpl和     
 private  UserDaoImpl userDaoImpl 的区别?加入了aop的事务管理[/color]

------最佳解决方案--------------------
咳……
楼主,不知道有父类对象引用子类实现么?

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注入是可能发生变化的,所以使用范围更大的父类对象来承接。
------其他解决方案--------------------
UserDao是接口,UserDaoImpl是接口的实现类。当然貌似你两种写法都是没有错的 但是一般都是
  private UserDao  userDaoImpl这样的吧,因为是引用接口。具体原因我也不知道了,地球人都这么写的!求真理..............
------其他解决方案--------------------
 private UserDao  userDaoImpl和     
 private  UserDaoImpl userDaoImpl  你这样一来,你定义userDao干什么呢
------其他解决方案--------------------
用接口,可以实现层与层之间的耦合性
------其他解决方案--------------------
在java里提倡面向抽象编程,而第一种就是面向抽象编程。楼主看看设计模式就知道了
------其他解决方案--------------------
求解在UserServiceImpl注入UserDaoImpl
 private UserDao  userDaoImpl和     
 private  UserDaoImpl userDaoImpl 的区别?加入了aop的事务管理