Spring笔记:IOC基础
引入IOC
在Java基础中,我们往往使用常见关键字来完成服务对象的创建。举个例子我们有很多U盘,有金士顿的(KingstonUSBDisk)的、闪迪的(SanUSBDisk),或者其他满足U盘接口的(USBDisk)。
如果我们用new方法,那么就意味着我们的接口只能用于某种特定品牌的U盘。
USBDisk usbdisk = new KingstonUSBDisk();
通过上述操作,USBDisk与KingstonUSBDick就形成了耦合。换句话说,如果想用闪迪的U盘就需要修改源码才可以。如果未来又更先进的U盘,那就要修改源码了,大型系统的资源多达成百上千,如果都采用这样的方式,系统就会形成严重的耦合,不利于维护和扩展。
这时候IOC的理念来了,首先它不是一种技术,而是一种理念。假设我们不采用new方法,而是使用一种描述的方式,每一个U盘都有一段自己的描述,通过接口我们可以读入这些信息,根据这些信息注入对应的U盘,这样我们在维护源码的时候只需要去描述这些信息并提供对应的服务即可,不需要去改动源码了。
仍然以U盘为例,如果用的是闪迪U盘,那么在信息描述段给出的就是闪迪U盘,系统会根据这个信息去匹配对应的实现类,而无需用new方法区生产实现类。同样,如果用的是金士顿U盘,那么在信息描述段给出的就是金士顿,系统也会自动生产对应的服务注入到我们的系统中,而我们只需要通过描述就可以获得资源,无需自己用new方法区创景资源和服务。
IOC注入方式
通过上述我们得知,Spring注入资源往往是通过描述来实现的,在Spring中往往是注解或者是XML描述,Spring中的IOC注入方式分为下面几种。
构造器注入
构造方法注入是依靠类的构造去实现的,对于一些参数较少的对象可以使用这个方式注入。比如角色类(Role),它的构造方法中包含三个属性:编号(Id)、角色名称(RoleName)、备注(Note)。
这样我们就描述了一个Role,它可以注入到其他资源中,但是如果构造方多,显然不是一个很好的方法,而Spring更加推荐使用setter注入。
Setter注入
假设上面角色类中还有一个没有参数的构造方法,它的三个属性都有setter方法,那么我们就可以使用setter注入。
使用setter注入更加灵活,因为使用构造方法,会疏导构造方法的参数个数、顺序这些因素干扰。侵入更加少,所以这是Spring首选的注入方式。
接口注入
Spring接口注入方式。它是一种注入其他服务的接口,比如JNDI数据源的注入,在Tomcat或者其他的服务器中往往配置了JNDI数据源,那么就可以使用接口注入我们需要的资源。
它允许你从一个远程服务中注入一些服务到本地调用。