Spring 是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
Spring是个粘合剂。
今天我要先讲控制反转IoC。
控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以任务IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
IoC——可以叫控制反转或依赖注入(DI),控制反转的反转——控制权在配置文件中,DI是由代码转容器
何谓控制反转(IoC=Inversion of Control),何谓依赖注入(DI=Dependency Injection)?对于初次接触这些概念的初学者,不免会一头雾水。IT界不亏是哄抢眼球的行业,每个新出现的词汇都如此迷离。IoC,用白话来讲,就是由容器控制程序各个部分之间的关系,而非传统实现中,由程序代码直接控制。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,就是所谓反转。
依赖注入的目标并非为软件系统带来更多的功能,而是为了提升组件重用的概率,并为系统搭建一个灵活、可扩展的平台。
IoC实例:
编写程序模仿计算机连接U盘或移动硬盘存储数据的过程。
因为计算机要和不同的USB设备连接,我们先来编写计算机的USB接口代码,代码如下:
IUsb.java
package com.ssh.house.di; public interface IUsb { //编写存储数据的方法 public void saveData(String word); }
编写U盘实现类:UsbDisk.java
package com.ssh.house.di; public class UsbDisk implements IUsb { public void saveData(String word) { System.out.println("U盘输出:" + word); } }
编写移动硬盘实现类:PortableDisk.java
package com.ssh.house.di; public class PortableDisk implements IUsb { public void saveData(String word) { System.out.println("移动硬盘输出:" + word); } }
编写计算机类:Computer.java
package com.ssh.house.di; public class Computer { private IUsb usb; public void saveData(String word){ usb.saveData(word); } public void setUsb(IUsb usb){ this.usb = usb; } }
编写配置文件:applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <!-- U盘类配置 --> <bean id="usbDisk" class="com.ssh.house.di.UsbDisk"></bean> <!-- 移动硬盘配置 --> <bean id="portableDisk" class="com.ssh.house.di.PortableDisk"></bean> <!-- 计算机类,将U盘实现类注册 --> <bean id="computer" class="com.ssh.house.di.Computer"> <!-- 属性name与类中所对应setUsb方法相对应 --> <property name="usb" ref="usbDisk"></property> </bean> </beans>
编写测试方法:在类TestDI中写
package com.ssh.house.di; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestDI { public static void main(String[] args) { //加载Spring配置文件 ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); //根据id向spring容器获取对象,容器根据依赖关系初始化对象并返回对象 Computer comp = (Computer)ac.getBean("computer"); comp.saveData("Hello World"); } }
输出结果:
U盘输出:Hello World
修改配置文件,把计算机类中ref指向portableDisk:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <!-- U盘类配置 --> <bean id="usbDisk" class="com.ssh.house.di.UsbDisk"></bean> <!-- 移动硬盘配置 --> <bean id="portableDisk" class="com.ssh.house.di.PortableDisk"></bean> <!-- 计算机类,将U盘实现类注册 --> <bean id="computer" class="com.ssh.house.di.Computer"> <property name="usb" ref="portableDisk"></property> </bean> </beans>
再次运行输出结果为:
移动硬盘输出:HelloWorld