SpringIOC对象管理

概念
IOC(Inversion of Control):控制反转。
IOC是Spring框架中的一个核心功能,即由SpringIOC容器来管理组件对象的生命周期,负责组件对象的创建和组件对象之间的依赖关系,这样可以大大降低程序各组件之间的耦合关系,符合软件工程中低耦合高内聚的理念。

环境搭建
搭建Spring环境就行,利用开发工具很容易,如果手动建立工程文件就需要下载相应的spring核心架包和配置文件。
这里写图片描述

为了方面Demo演示,导入Junit4测试包进行测试。

Spring Bean对象管理
Spring可以负责Bean对象的创建工作,主要方法有构造器,工厂静态方法和工厂对象方法3中,最常用是使用构造器创建方法,也就是“new 一个对象”,另外两种也有必要了解一下。
使用JDK中提供的Calendar这个抽象类说明,先查看一下这个抽象类的API和源码(源码可以在jdk安装目录下的src.zip中查看)
这里写图片描述

这里写图片描述
有多个重载的getInstance()静态方法,它可以返回Canlendar对象,在这个抽象类中,有个getTime()方法,可以返回一个Date类型的时间对象。
了解了这些,我们可以模拟Bean对象创建的三种方式和它们相对应的通过Spring对象管理完成对象创建的方式。

项目目录结构如下:
这里写图片描述

TestBean类代码:

package com.hnust;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class TestBean {
    //不使用SpringIOC创建获取对象的三种方式
    @Test
    public  void test1() {
        //通过构造器创建对象
        Calendar c1 = new GregorianCalendar();
        System.out.println(c1);

        //通过抽象类静态方法创建对象
        Calendar c2 = Calendar.getInstance();
        System.out.println(c2);

        //通过抽象类对象方法创建对象
        Date dt = c2.getTime();
        System.out.println(dt);

    }
    //采用Spring容器创建获取对象的三种方式
    @Test
    public void test2(){
        //先创建Spring容器对象
        ApplicationContext act = new ClassPathXmlApplicationContext("spring-config.xml");

        Calendar cd1 = act.getBean("c1",GregorianCalendar.class);
        System.out.println(cd1);

        Calendar cd2 = act.getBean("c2",Calendar.class);
        System.out.println(cd2);

        Date date = act.getBean("dt",Date.class);
        System.out.println(date);
    }
}

Spring的配置文件:
spring-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.xsd">
    <!--通过构造器创建对象-->
    <bean id="c1" class="java.util.GregorianCalendar"></bean>

    <!--通过抽象类静态方法创建对象-->
    <bean id="c2" class="java.util.Calendar" factory-method="getInstance"></bean>


    <!--通过抽象类对象方法创建对象-->
    <bean id="dt" factory-bean="c1" factory-method="getTime"></bean>
</beans>

在test2()方法中,利用Spring来管理创建对象,大概流程是,程序先创建一个Spring容器对象,容器对象通过getBean()方法去查找spring配置文件中配置bean,根据唯一的bean id创建出相应的对象类型返回,这样就得到了对象,如果有方法可以返回对象,那么就需要填写相应的工厂方法。(这里本来写的好详细,但是坑爹的是博客忘记保存,吃个饭回来机器卡顿,重写就先简略着吧)

这里是程序运行结果:
这里写图片描述
从程序运行结果来看,上面三行是test1()的依次输出的c1、c2、c3对象的类信息,下面的就是test2()的运行结果,其中红色字体是Spring容器加载的信息,红色字体以下和test1()输出一样。

以上相当于就是学习了一种通过Spring容器来自动创建组件对象的方式,利用的就是IOC机制,将创建对象的控制权交给Sping容器管理。为什么要将创建对象的控制权交给第三方呢,在上述程序中使用Sping创建对象并没有使得程序更加简单,相反还加入了Spring文件架包,JVM还需要加载Spring容器,加重了机器运行负荷,以上程序中,我们只是写一个简单的Demo生成一个对象,并没有涉及各对象之间的关系,在实际的项目中,各组件之间生成的对象太过繁多,而且它们之间往往会有引用调用以及其他的关系,对象之间复杂的关系会让编程逻辑不清晰。由于程序项目的日益复杂,SpringIOC让各对象之间实现解耦的功能就大放异彩了。

举个简单例子说明,毕业生初来北京工作,公司不提供住宿,只能自己找房子,而在北京这种寸土寸金的地方找个理想住所实在困难,北京的房子太多了(复杂程序中类对象太多了),然而要找到性价比高,上班方便的房子(所需要的对象)所以这时候只能找链家、五八同城类似的中介公司和中介网站查找房源信息(Spring配置文件信息),然后把符合自己各方面需求的房子定下来,这样就间接的和房东建立齐了租赁关系,虽然中介方收取了中介费,还提出了各种要求,但是我们总算找到了心仪的房子,节约了大量的时间投入工作,升职加薪,赢取白富美,SpringIOC就是中介方,让程序员极大的提高了编程效率,更专注于业务逻辑编写,而且随着Spring的日益优化,它对于系统性能的影响降低,它的优势远远超过使用它的代价。

那么SpringIOC如何建立对象之间的关系呢?有两种方式:
Spring依赖注入
Spring注解配置
分别写一篇文章详细说明。

猜你喜欢

转载自blog.csdn.net/superxiaolong123/article/details/79746698