Spring之IOC(控制反转)入门理解
在面向对象编程中,我们经常处理处理的问题就是解耦,程序的耦合性越低表明这个程序的可读性以及可维护性越高(假如程序耦合性过高,改一处代码通常要对其他地方也要做大量修改,难以维护)。控制反转(Inversion of Control或IoC)就是常用的面向对象编程的设计原则,使用这个原则我们可以降低耦合性。其中依赖注入是控制反转最常用的实现。
举个例子:
假如现在有三个Dao实现类A, B, C,分别对应不同的操作,通常我们在业务层对其进行实例化,然后对外提供实例化后的方法。如下所示:
1 public class UserSeviceImpl implentments UserService{ 2 private UserDao userDao = new A(); //注意这里写死在代码里了,只要调用getUser,返回的就是A的getUser方法 3 4 public void getUser(){ 5 userDao.getUser(); 6 } 7 }
可以看到这时候实例化的是A类,是写死在代码里的,而如果后面我想再调用B类中的操作可怎么办呢? 没错,这种情况下就需要对业务层上面这段代码进行改动了。假如,有成千上万个Dao实现类,需求每换一次就要修改一次代码,可想而知有多痛苦。
于是就有了IOC控制反转(这里的控制,本人的理解是对对象创建的控制权)的思想,上面的代码是程序主动创建对象,控制权在程序猿手上;而控制反转后的代码应该变成程序被动接受对象,控制权在用户手上,就像下面这样。好好体会一下控制反转后的代码:
1 public class UserSeviceImpl implentments UserService{ 2 private UserDao userDao; //注意这里不再进行实例化了,而是通过提供一个set方法来完成这个工作。
3 public void setUserDao(UserDao userDao){ //利用set动态的进行对象的注入
4 this.userDao = userDao;
5 }
6 public void getUser(){ 7 userDao.getUser(); 8 } 9 }
于是使用这种方式我们在需求变化后不用再修改业务层的代码,用户直接给setUserDao传入不同Dao实现类的对象就好,使得系统的耦合性大大降低,程序猿也就可以更加专注在业务的实现上,而不用去管理对象的创建问题啦!这是IOC的原型,也是简单的入门理解。
应用到spring上,所谓的 IoC,一句话搞定:就是对象由spring来创建,管理,装配。 后续更难的再慢慢学吧~