Spring的IOC理论

Spring

什么是Spring?

大家都知道,spring的中文意思是春天,而Spring框架,为软件开发行业带来了春天。为什么这么说呢?我们来看一看他的优点

优点

  • Spring是一个开源框架,也就是说他是免费的
  • Spring是一个轻量级、非侵入式框架。什么是非侵入式呢?Spring利用反射和动态调用来实例化的,代码中没有任何与spring交叉的类,哪怕把spring的jar全部去了,你的代码不受任何影响,加上其他的框架后可以继续运行
  • IOC(控制反转)、AOP(面向切面)这个以后会慢慢谈
  • 支持事务,也支持框架

Spring的组成

Spring的组件内容

  • Spring Core:这是Spring的核心容器,主要组件是BeanFactory,其作用是实现控制反转IOC,利用工厂设计模式对程序实现解耦。
  • Spring context:即上下文,向Spring提供框架的上下文信息
  • Spring AOP:面向切面,这个思想以后还会讲到,这里不过多深究
  • Spring DAO:抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息
  • Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map
  • Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文
  • Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。这个以后也会讲到。

Spring IOC思想

问题抛出

先问大家一个问题,如果有一天,我们去动物园,动物园里有小猫小狗,我们要观看这些动物。把我们观看的过程编写成一个程序,该怎么写?

程序实例

1、我们先创建一个Animal接口

public interface Animal {
    void info();
}

2、我们创建几只小动物类实现Animal接口
小猫类

public class Cat implements Animal {
    @Override
    public void info() {
        System.out.println("这是一个小猫");
    }
}

小鸟类

public class Bird implements Animal {
    @Override
    public void info() {
        System.out.println("这是一只小鸟");
    }
}

小狗类

public class Dog implements Animal {
    @Override
    public void info() {
        System.out.println("这是一只小狗");
    }
}

3、创建一个动物园类,现在动物园里有一只小鸟

public class Zoo {
    private Animal animal = new Bird();

    public void see(){
        animal.info();
    }
}

4、是“我”要去看小动物,那么就要创建一个我啦!

public class Me {
    public static void main(String[] args) {
        Zoo zoo = new Zoo();
        zoo.see();
    }
}

好了,这个程序到这里就基本实现了,我们运行一下看一下结果

程序到这运行起来是没有问题的,但是有一个问题,我如果不看小鸟了,我想看小猫,怎么办?那只能去Zoo类里面,将Bird换成Cat了

public class Zoo {
    private Animal animal = new Cat();

    public void see(){
        animal.info();
    }
}

那如果我们想看小狗呢,动物园里可有成千上万只小动物啊,难道我们每看一次,动物园就要实例化一只动物对象给我们吗?而且不只是我,还有很多很多人要去动物园里看小动物呢!难道每次都要动物园实例化?

这显然是不可行的,这就需要我们的控制反转思想了。

先看我接下来的代码段:

Zoo类

public class Zoo {
    public void setAnimal(Animal animal) {
        this.animal = animal;
    }

    private Animal animal;

    public void see(){
        animal.info();
    }
}

Me类

public class Me {
    public static void main(String[] args) {
        Zoo zoo = new Zoo();
        zoo.setAnimal(new cat());
        zoo.see();
        //现在我们想看小鸟
        zoo.setAnimal(new Bird());
        zoo.see();
    }
}

输出结果:
在这里插入图片描述
这个输出结果也是可以接受的,那么聪明的你,是否发现了这其中的变化呢?

你可能会说,只不过我把实例化对象的事情换成另外一个类而已嘛,结果都一样。但实际上,这已经发生了革命性的变化了。

一开始的程序,“我”只要想看一种动物,动物园就必须给我实例化一种动物,我如果要看另外一种,我就得去动物园里修改。而更新了之后的程序呢,“我”想看那一种动物,我只需要修改一下我想看的动物类型就好了。以前是动物园主动创建对象,我们被动接受,现在是我们主动创建对象,动物园被动接受。

换言之,以前一个程序,用户想要什么需求,程序就得创建什么对象,因为程序要服务每个用户,所有用户需求都需要满足;但现在,程序只需要被动接收对象,而我们需要什么需求,我们自己来创建对象即可,程序只需要向用户提供一个接口。

这种思想就是IOC(控制反转)思想的原型,运用这种思想,我们程序员再也不用管理对象的创建了,可以有更多的精力去关注业务层的实现,耦合度也大大降低。

IOC的实现

applicationContext.xml

<?xml version="1.0" encoding="GBK"?>
<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="bird" class="bean.Bird"/>
    <bean id="cat" class="bean.cat"/>
    <bean id="dog" class="bean.Dog"/>
</beans>

applicationContext.xml已经代替了Zoo,现在是spring来帮助我们获取对象。

Me类

public class Me {
    public static void main(String[] args) {
        BeanFactory beanFactory = new ClassPathXmlApplicationContext("applicationcontext.xml");
        Animal animal = beanFactory.getBean("bird",Animal.class);
        animal.info();
    }
}

使用Spring为我们提供的BeanFactory,并调用其getBean()方法,就可以获得配置文件xml中的对象。

运行结果:
在这里插入图片描述

IOC的理论就是这样子了,有什么不对的地方,欢迎指出或评论区讨论,有关AOP我们下次继续讨论。

学无止境,勇攀高峰!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值