SpringIOC个人解析

来源:互联网 发布:中级计算机程序员证 编辑:程序博客网 时间:2024/05/11 23:03

IOC定义

Ioc—Inversion of Control,即“控制反转”是一种设计思想,在java中,如果一个对象需要使用另外一个对象,比如电脑对象需要使用鼠标对象,此时,需要使用鼠标对象,则不需要电脑对象自己创建鼠标对象,而是由IOC容器根据电脑对象的要求,为电脑对象创建鼠标对象,提供给电脑对象。IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了

Spring IOC原理

IoC是spring的核心,贯穿始终。所谓IOC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系,即所有对象的创建及销毁都交由spring的IOC容器进行管理。而对象直接的关系及引用也是依赖于springIOC容器的管理和注入。IOC的好处是松耦合,使用IOC容器,应用程序所需要的一些组件不必再由自己创建,而交由IOC容器管理,当需要变更应用程序某些实现类的功能时,不再需要硬编码,而只需修改spring的配置文件即可。下面是一个简单的IOC例子。

Spring IOC简单例子

我们这里写一个简单例子,定义三个类,computer,keyboard,mouse,computer有个玩游戏的功能,玩游戏需要使用keyboard和mouse,keyboard和mouse又可以分为不同的品牌。按照这个需求我们先使用java普通的实现,然后再使用SpringIOC实现,再对比二者之间的优劣。

普通的java实现代码如下:

//鼠标类public interface Mouse {    public String getBrand();}//罗技鼠标public class LogitechMouse implements Mouse{    @Override    public String getBrand() {        // TODO Auto-generated method stub        return "logitechMouse";    }}//雷蛇鼠标public class RazerMouse implements Mouse{    @Override    public String getBrand() {        // TODO Auto-generated method stub        return "RazerMouse";    }}//键盘类public interface Keyboard {    public String getBrand();}//罗技键盘public class LogitechKeyboard implements Keyboard{    @Override    public String getBrand() {        // TODO Auto-generated method stub        return "logitechKeyboard";    }}//雷蛇键盘public class RazerKeyboard implements Keyboard{    @Override    public String getBrand() {        // TODO Auto-generated method stub        return "RazerKeyboard";    }}////电脑类public class Computer {    private Keyboard keyboard;    private Mouse mouse;    public void playGame(){        System.out.println("I use " + mouse.getBrand()+" and "                +keyboard.getBrand()+" play games");    }    public static void main(String[] args) {        Computer computer = new Computer();           //创建电脑        Mouse mouse = new LogitechMouse();            //创建鼠标        Keyboard keyboard = new LogitechKeyboard();   //创建键盘        computer.setMouse(mouse);                     //为电脑配置鼠标        computer.setKeyboard(keyboard);               //为电脑配置键盘        computer.playGame();                          //用电脑打游戏    }    public Keyboard getKeyboard() {        return keyboard;    }    public void setKeyboard(Keyboard keyboard) {        this.keyboard = keyboard;    }    public Mouse getMouse() {        return mouse;    }    public void setMouse(Mouse mouse) {        this.mouse = mouse;    }

观察上诉代码,我们发现,当我们要完成使用电脑打游戏这个功能时,我们首先得找一台电脑,接着再给电脑配置鼠标键盘,这些动作都需要我们主动去做。即在如上应用程序中需要我们主动去创建电脑,鼠标,键盘等对象,我们才能打游戏。下面我们来看看使用springIOC怎么实现:

//修改上面computer类中的main方法,改为通过springIOC容器获取对象    public static void main(String[] args) {        ApplicationContext ctx = new FileSystemXmlApplicationContext(                new String[]{"config/context.xml"});        Computer computer = (Computer) ctx.getBean("computer");        computer.playGame();    }

spring配置文件如下

<?xml version="1.0" encoding="UTF-8"?><beans      xmlns="http://www.springframework.org/schema/beans"      xmlns:tx="http://www.springframework.org/schema/tx"      xmlns:p="http://www.springframework.org/schema/p"      xmlns:aop="http://www.springframework.org/schema/aop"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:context="http://www.springframework.org/schema/context"     xsi:schemaLocation="http://www.springframework.org/schema/beans       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd       http://www.springframework.org/schema/tx       http://www.springframework.org/schema/tx/spring-tx-3.0.xsd       http://www.springframework.org/schema/aop        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"      default-autowire="byName">    <bean id="computer" class="com.mytest.demo.Computer"/>    <bean id="mouse" class="com.mytest.demo.LogitechMouse"/>    <bean id="keyboard" class="com.mytest.demo.LogitechKeyboard"/></beans>

观察实现电脑打游戏这个需求的两种方式,我们发现再普通的java应用程序中,我们所需要的对象需要应用程序主动创建,依赖关系也是由应用程序来维护。而通过springIOC方式,我们只需要在配置文件中进行简单的配置,在应用程序中初始化IOC容器,对象的管理全部交给了IOC容器,应用程序只需直接执行他需要的方法即可。对于上述例子,普通java程序实现好比当我们需要玩游戏时,我们得自己买电脑,自己买鼠标,键盘(new 对象),当现有鼠标键盘不满足要求的时候,我们还得重新买新鼠标,键盘(重新new 对象),一切弄好后才能打游戏。而通过IOC容器则好比去网吧,我们只要说出我们对电脑的要求(配置文件),网吧都直接提供给我们,这样我们就能愉快的打游戏了,而不需要关心电脑,鼠标,键盘这些东西从哪里来。当对鼠标,键盘不满意,和网吧说一声(修改配置文件),即可使用上新鼠标键盘打游戏。上面只是一个简单的IOC例子,但是已经体现了出了使用IOC编程的优越性,代码耦合性更低,需要切换需要使用的对象时也不再需要硬编码,只需要简单改下配置文件就可实现。

Spring IOC部分源码分析

上面的例子在SpringIOC中的实现通俗的解释其实就是三个步骤
1:读取配置文件context.xml,扫描其中的配置属性

Spring IOC部分配置解析

原创粉丝点击