怎么理解控制反转与依赖注入
何为依赖,何为注入
public class User{
private String username;
private String password;
private UserInfo userinfo;
public UserInfo getUsreInfo(){
return this.UserInfo;
}
public void setUserInfo(UserInfo userInfo){
this.userInfo=userInfo;
}
}
public class UserInfo{
private String phoneNumber;
private String Address;
private String sex;
}
- User类中需要使用到用户信息类,用户类对用户信息产生了依赖。
- 当使用setUserInfo()方法对User类中的userinfo成员变量赋值时,就叫做注入
何为控制,何为反转
- 在传统模式中:
- 客户端类需要得到一个用户类对象,但是用户类对象又依赖于用户信息类中的数据,所以我们需要在客户端类中new一个用户信息对象,new一个用户类对象,客户端类控制用户类与用户信息类的实例化,手动将用户信息类对象注入用户类对象。
- 程序可以做到正常工作,但是代码被写死了,如果要更改需求,客户端需要产品类对象,这时候我们就需要手动更改代码new一个产品类对象,如果有一千个地方需要更改,这个工作量可想而知。
- 使用控制反转后:
- 客户端类需要得到用户类对象,这时候客户端类并不是直接new一个用户类与用户信息类,而是向IoC容器索要,由容器控制用户类对象与用户信息类对象的实例化与依赖注入。之前是客户端自己new,现在是向容器索要,客户端的创建方式发生了反转****之前是手动注入,现在是IoC容器进行注入,注入的方式发生了反转
DI ≠ IOC
IoC的概念更宽广一些,而DI是IoC的主要实现方式,但这并不意味着DI就是IoC,将二者混为一谈 这是不对的,很容易误导他人。