Spring中的IOC和DI

初识IOC和DI

在一开始学习Spring的时候,IOC和DI就会不停的出现的在我们眼前,通过使用IOC和DI可以大大的降低程序的耦合性,将所有的对象通过容器管理,可以解决一些不必要的麻烦,这里举一个简单的例子:最开始项目用的数据库是Mysql,所以我们在程序里面使用的都是new Mysql(),但是过几天发现Mysql不合适,要换成Oracle,然后又要改程序的代码将所有关于Mysql的都改成Oracle,如果使用IOC和DI的方式源码不用改,增加一个实现类,然后修改一下XML的配置文件就可以轻松解决。所以从很大程度上IOC和DI大大解放了我们对程序控制,全部都由一个容器进行管理。

对于IOC和DI,其实并不是一种什么技术,而是一种思想。

IOC(Inversion of Control,控制反转),即将设计的对象交给容器管理,而不是由我们手动在对象里面控制。通俗的说就是,在一个XML配置文件中,配置对象的名字、属性等内容,然后通过程序由容器自己创建。对于IOC其实并不是一门技术,而是一种思想,将各种统一管理,其实现的基本依靠就是反射。而DI(Dependency Injection,依赖注入),即在通过IOC将对象的调用权交给容器之后,由容器来对对象的进行配置,进行属性的设置等操作。因此IOC和DI是一种相辅相成的搭档,两者缺一不可。

IOC的核心代码

 

初实IOC和DI

对于IOC和DI的概念网上有很多,这里就不多说,直接用IOC和DI的简单实现来理解IOC和DI的具体实现方式。

IOC和DI的目的是将对象的实例化、初始化。所以我们需要一个配置文件来告诉我们需要将那些对象交给容器管理,现在普遍的是两种方式——Xml配置和JavaBean注解。这里我们就采用Xml的方式来实现。在Xml中需要加上需要被管理对象的唯一标识(ID或者Name)、全限定名以及对象的属性。

被管理对象的配置

有了上图的配置对象,我们现在的首要目标是需要去读取这个配置文件的内容,这里使用dom4j来读取Xml,首先我们创建一个ClassPathXmlApplicationContext的对象来实现对容器的管理,它实现一个我们自定义的ApplicationContext接口,这个接口含有一个从容器中获取对象的方法。具体如下图所示,这个对象里的beans就是对象存放的Map集合,我们所有的对象都放在这里面的。可以看到我们在这个对象的构造方法中实现了配置文件的读取、IOC、DI三个操作,然后就可以直接通过getBean方法来获取指定的对象。

自己实现容器对象实现IOC和DI操作

读到了配置文件的信息,我们就需要开始根据这些信息来创建对象。首先通过Xpath的方式获取配置文件中bean标签中的内容,Bean标签中必须含有一个唯一标识符(ID或者name)以及全限定名,这两个参数缺一不可,都是后续操作的根基,在生成对象之前,先判断对象是否重复创建,避免空间浪费,然后通过反射+全限定名初始化对象,然后放入map集合中,以ID为Key,具体对象为value。

IOC实现

接下来就对已经初始化的对象进行赋值操作即DI。首先获取bean节点下面的所有Property标签,因为这个标签都是存放的对象的属性名以及属性值,然后要根据ID来获取Obj对象,循环遍历读取的property标签的数据,然后根据标签填的属性名字和Obj的类对象获取PropertyDescriptor(属性描述器),通过属性描述器获取到对应属性的set方法(因此我们的对象必须有Get/Set方法),然后根据属性的类型,将property存储的值转为具体的类型,然后调用方法的Invoke进行设置。

DI实现

以上就是IOC和DI的一个基本实现思路。

猜你喜欢

转载自blog.csdn.net/qq_35363507/article/details/104674522