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

本文探讨了为何需要Spring容器,并通过一个手机组装的例子展示了在没有Spring时如何管理对象。介绍了Spring的设计初衷,模拟了一个简单的容器概念,并详细说明了如何使用Spring IOC容器,包括配置文件mobile_config.xml的使用,以及运行Spring所需的jar包导入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

控制反转空气(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)来配置,注解配置,这里就不展开细说了,总之,两者的功能是一样的!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值