IoC(Inversion of Control,控制倒转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。
该思想提出的背景:以往编写的代码耦合度太高,往往修改一处代码,就需要修改很多处互相关联的代码。在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改原代码!如果程序代码量十分大,修改一次的成本代价十分昂贵!
以往的业务实现我们通常都是使用的三层架构,“用户层、业务层、dao层”。逻辑通常为用户层调用业务层,业务层调用Dao层获取数据返还给用户层,用户层与Dao层不产生直接关联,都是通过业务层去获取Dao层的数据。
Dao层代码
UserDao 接口
public interface UserDao {void getUser();
}
UserDaoImpl 实现类
public class UserDaoImpl implements UserDao{@Overridepublic void getUser() {System.out.println("获取默认用户信息");}
}
service层(业务层)代码
UserService 接口
public interface UserService {void getUser();
}
UserServiceImpl 实现类
public class UserServiceImpl implements UserService{private UserDao userDao = new UserDaoImpl();@Overridepublic void getUser() {userDao.getUser();}
}
用户层代码
public class MyTest {public static void main(String[] args) {UserService userService = new UserServiceImpl();userService.getUser();}
}
运行结果:
从结果可以看出,用户层获取到了Dao层的数据,没有问题。
现在的代码业务中,只要一个需求,就是从Dao层中获取默认用户数据。如果用户的需求增加了,需要获取其他用户数据,就需要在Dao层中重新创建新的实现类,并且在业务层的实现类中重新 new 一个Dao层中新创建的实现类的对象,用户层业务不变。
Dao层
新增 MySqlUserDaoImpl(新的数据来源)
public class MySqlUserDaoImpl implements UserDao{@Overridepublic void getUser() {System.out.println("通过MySQL获取用户数据");}
}
service层(业务层)代码
public class UserServiceImpl implements UserService{// private UserDao userDao = new UserDaoImpl();private UserDao userDao = new MySqlUserDaoImpl();@Overridepublic void getUser() {userDao.getUser();}
}
用户层代码不变
用户层成功获取到了新的数据来源。
但是每次新增加数据来源都需要去将 service 层的实现类中 new 新的对象,不但程序耦合性极高,如果程序代码量十分庞大的话,还需要耗费大量的时间去修改。
Java革命性的一步出现了!!在业务层的实现类中新增 set() ,专门用来接收对象,从此我们便不在需要一个一个的去 new 新的对象了,而是将创建对象的主动权交给用户层手中,让用户自己去选择。
service层(业务层)代码
UserService 接口中新增 set() 方法用来接收用户创建的对象
public interface UserService {void getUser();void setUser(UserDao userDao);
}
修改 UserServiceImpl 实现类
public class UserServiceImpl implements UserService{// private UserDao userDao = new UserDaoImpl();// 将UserDao 设置成变量,而不是创建指定的对象private UserDao userDao;@Overridepublic void getUser() {userDao.getUser();}@Overridepublic void setUser(UserDao userDao) {this.userDao = userDao;}
}
用户层代码
public class MyTest {public static void main(String[] args) {UserService userService = new UserServiceImpl();//用户需要创建那个对象就创建那个对象,将创建权交给用户userService.setUser(new UserDaoImpl());userService.getUser();}
}
运行结果
以往的业务逻辑是程序是主动创建对象!控制权在程序猿手上!
使用了set注入后,程序不再具有主动性,而是变成了被动的接收对象!用户掌握主动权,由用户选择所要调用的业务!
这种思想,从本质上解决了问题,我们不在需要在程序中管理此类对象的创建了,将对象的创建权交给用户。这样做不但可以大大降低程序代码的耦合,还可以使我们更加专注将经理放在业务实现上。这就是 Spring 框架 IoC思想的原型。
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法。也有人认为DI只是IoC的另一种说法。没有IoC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。
采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。
上一篇:python excel导入