理解Java Spring核心功能之一:控制反转容器(IOC Container)

来源:互联网 发布:双向数据绑定 编辑:程序博客网 时间:2024/05/22 13:00
控制反转空气(IOC Container)是Spring的一个重要基础功能,不喜欢新名词的同学,姑且理解为**组件装配容器**

为什么需要Spring 容器
要理解Spring的设计精神,先来看看Spring的设计初衷。
先看没有Spring之前,我们怎么做?
以一个实际情况说明,大家都应该购买过手机。那么你肯定有这样的经历,收到手机,打开包装,给手机装上SIM卡,装上电池(当然,现在基本都是一体机,这里主要为了给大家说明问题),开机
我们用java面向对象的思想设计
手机,SIM卡,电池,这三个对象,也可以成为实体,物件,组件,零件。
名称不重要,反正就是这三个东西,自然对应三个java类。

package com.study.application.IOCContainer.MobileFactory;public class Battery {    private String power;    public Battery(String power) {        super();        this.power = power;    }    public String getPower() {        return power;    }}
package com.study.application.IOCContainer.MobileFactory;public class SIMCard {    private String number;    public SIMCard(String number) {        super();        this.number = number;    }    public String getNumber() {        return number;    }}
package com.study.application.IOCContainer.MobileFactory;public class Mobile {    private String brand;    private Battery battery;    private SIMCard simCard;    public Mobile(String brand) {        this.brand = brand;    }    public void setBattery(Battery battery) {        this.battery = battery;    }    public void setSimCard(SIMCard simCard) {        this.simCard = simCard;    }    public void poweron() {        System.out.println("Moblie:" + brand + " powered on");        System.out.println("Battery:" + battery.getPower());        System.out.println("SIMCard:" + simCard.getNumber());    }}

这里我们不是用Spring容器

package com.study.test.test1;import com.study.application.IOCContainer.MobileFactory.Battery;import com.study.application.IOCContainer.MobileFactory.Mobile;import com.study.application.IOCContainer.MobileFactory.SIMCard;public class Test1 {    public static void main(String[] args) {        //创建零件        Mobile mobile = new Mobile("HUAWEI");        Battery battery = new Battery("2000mA");        SIMCard simCard = new SIMCard("12356674543");        //组装零件        mobile.setBattery(battery);        mobile.setSimCard(simCard);        //使用        mobile.poweron();    }}
这里运行结果良好,因为这里只有3个零件,创建和组装都没有问题,但是如果有1000个零件,创建和组装过程就很繁琐。试想,我们在网上买了一个山地自行车,要把它装配起来,我们首先会看货品清单和装配说明书。那么,Spring就是为创建和组装零件而设计的!

模拟简单的容器
在介绍Spring之前,我们先简单介绍一下容器的概念。
在上面的例子中,我们进行一下修改:

package com.study.test.test1;import com.study.application.IOCContainer.MobileFactory.Battery;import com.study.application.IOCContainer.MobileFactory.Mobile;import com.study.application.IOCContainer.MobileFactory.SIMCard;public class Test1 {    public static void main(String[] args) {        //创建容器        Object[] container =  new Object[3];        //创建零件        Mobile mobile = new Mobile("HUAWEI");        Battery battery = new Battery("2000mA");        SIMCard simCard = new SIMCard("12356674543");        //组装零件        mobile.setBattery(battery);        mobile.setSimCard(simCard);        //放入容器        container[0] = mobile;        container[1] = battery;        container[2] = simCard;        //使用        Mobile mobile = (Mobile)container[0];        mobile.poweron();    }}
以上程序创建数组作为容器,创建和组装实例后放入容器,使用时,从容器中获取实例。这个程序看起来有些多此一举,但确实体现了容器的主要特征。这里,我们手动完成了创建容器->创建和组装实例->放入容器的工作。使用Spring后,这些工作就可以由Spring来完成。这里我们使用数组来作为容器,通过数字下标来获取实例,Spring使用ConcurrentHaspMap作为容器,通过字符串ID获取对象(事实上,在ConcurrentHaspMap内部也是把对象包装一下放在数组里)。这里,我们人工完成零件的组装,而Spring通过配置文件来描述零件之间的装配关系。Spring的配置文件使用XML格式描述组件清单和装配关系,这个配置文件相当于现实生活中的货品清单和装配说明书。

使用Spring容器
使用Spring容器是,需要一个配置文件(货品清单)mobile_config.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-4.0.xsd">    <bean id="battery" class="com.study.application.IOCContainer.MobileFactory.Battery">        <constructor-arg name="power" value="3000mA"></constructor-arg>    </bean>    <bean id="simcard" class="com.study.application.IOCContainer.MobileFactory.SIMCard">        <constructor-arg name="number" value="124365546757"></constructor-arg>    </bean>    <bean id="mobile" class="com.study.application.IOCContainer.MobileFactory.Moblie">        <constructor-arg name="brand" value="HUAWEI"></constructor-arg>        <property name="Simcard" ref="simcard"></property>        <property name="Battery" ref="battery"></property>    </bean></beans> 
这里的bean就是对象实例的意思,java里所有的对象实例都可以成为bean,这个配置文件,简单说就是一个bean列表,每个bean通过XML配置其创建其初始值或装配对象,id属性,是为了以后便于从容器中获取。运行程序
package com.study.test.test1;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.study.application.IOCContainer.MobileFactory.Mobile;public class Test1 {    public static void main(String[] args) {        ApplicationContext context = new ClassPathXmlApplicationContext("/moblie_config.xml");        Mobile mobile = (Mobile) context.getBean("mobile");        System.out.println("********见证奇迹**********");        mobile.poweron();    }}

这里写图片描述
当然,要运行期Spring,我们就必须导入必要的jar包,大家可以去官网下载!

这里的context,简单的理解就是对象容器,Spring通过分析配置文件完成对象创建,装配的工作。使用时,通过ID获取即可!Spring通过配置文件来描述零件清单和装配关系,装配关系变动时,修改配置文件即可,不需要重新编译代码。对于简单的例子,看不出Spring容器的优势。对于很多零件,装配关系复杂多变的系统,就能体现出Spring的优势。Spring容器除了使用xml来配置,还可以使用注解(Annotation)来配置,注解配置,这里就不展开细说了,总之,两者的功能是一样的!
原创粉丝点击