Spring IoC

    技术2022-05-19  25

    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


    最新回复(0)