一、IOC和DI
1、简介
IOC是Inversion Of Control(控制反转)的缩写,它是一种设计思想,是指将对象的控制权由程序代码反转给外部容器。
public class AccountServiceImpl implements IAccountService {
private IAccountDao accountDao;
public AccoutServiceImpl( {
this.accountDao = new AccountDaolmpl(); //在Spring中看不到这条语句[new AccountDaolmpl()]
}
}
在Spring 中,控制反转是实现Spring容器的指导思想。有了Spring容器,开发人员无需编写管理对象生命周期和依赖关系的代码,此项工作将由Spring容器根据配置自动完成,如此一来,对象的控制权由程序代码反转给Spring容器。
DI是Dependency Injection(依赖注入)的缩写,它是控制反转的另一种说法,同时也为控制反转提供了实现方法。依赖注入是指调用类对其他类的依赖关系由容器注入,这就避免了调用类对其他类的过度依赖,降低了类与类之间的耦合。注意,降低类与类之间的耦合度并不是让他们不再依赖,而是使得调用类不依赖具体的某个类的对象。
传统方式中,如果一个类依赖另一个类,则必须在该类中new一个具体依赖类的对象,比如:
public class AccountServiceImpl implements IAccountService {
private AccountDaoImpl accountDao;
public AccoutServiceImpl() {
accountDao = new AccountDaoImpl();
}
}
以上代码中,AccoutDaoImpl是 IAccountDao接口的具体实现类,当需要换接口的另一种实现时,代码需要进行相应改变:
private AccountDaoImpl2 accountDao;
accountDao = new AccountDaoImpl2();
实际开发中类与类之间依赖应该做到:编译期不依赖,运行时才依赖。
编译期依赖如下:
public class AccountServiceImpl implements IAccountService {
private AccountDaoImpl accountDao;
public AccoutServiceImpl(){
this.accountDao = new AccountDaoImpl();
}
}
运行时依赖如下:
AccoutServiceImpl类定义里,不再依赖具体的IAccountDao接口的实现类。
如果代码中存在多处类对象的创建,当具体实现类改变时相应代码都需要修改。此