Spring IOC整理

示例展示

Spring的一大特点是利用配置的xml文件实现依赖注入。 所谓依赖注入是指把一个业务对象注入另一个业务对象,从而达到对象间的松耦合。(注意是业务对象哦!)
依赖注入讲的通俗一点,就是让一个对象的创建不用new了,可以自动的生产。这其实是利用java里的反射,反射就是在运行时动态的去创建、调用对象。

下面我们来举个例子(具体代码参见右侧源码,只适合菜鸟看)

示例场景

场景:现在有个磁盘输出的业务,客户端需要通过2个业务对象进行输出。 一个是通过Floppy(软盘),另一个是通过USB接口。
如果是一般的写法,如果我们要进行磁盘输出业务,必须先new一个USB对象或者软盘对象,进行的次数多了就会非常的重复。
我们要实现一个功能,就是磁盘输出的时候,我们只负责磁盘输出的业务逻辑,至于首先new一个新的Bean的业务和new哪一个新Bean,我们交给xml配置文件管理,这样就可以减少代码的耦合。

示例原理图

实现步骤

1.首先建立一个设备接口 IDeviceWriter 类。
2.再建立软盘和USB类来实现这个接口,分别是 FloppyWriter 类和 UsbDiskWriter 类。
3.然后建立磁盘业务的JavaBean类,我们简称它为 BusinessBean 。 该Bean有一个成员用于存放设备-writer。 然后有get,set方法和一个核心的磁盘输出业务的方法。
4.业务类完成之后,我们便可以在配置文件 businessFactoryConfig.xml 中进行配置依赖关系了。 (注:bean依赖关键字是ref)。关键代码如下:

<bean id="floppy" class="spring.basic.BusinessFactory.FloppyWriter"/>
    <bean id="usb" class="spring.basic.BusinessFactory.UsbDiskWriter"/>
    <bean id="businessBean"
          class="spring.basic.BusinessFactory.BusinessBean">
        <property name="deviceWriter">
            <ref bean="floppy"/>
        </property>
</bean>

5.编写客户端代码,获得Spring中定义的Bean对象,执行save方法,查看磁盘输出时是使用了哪一种方法。
在上面的配置文件中,如果注入了floppy bean,那么是储存至软盘… 如果注入usb bean,那么是储存至移动硬盘…

知识准备

什么是IOC?
控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。依赖注入应用比较广泛。
从注入的方法上看,依赖注入主要可以划分为三种类型:属性注入(set注入)、构造函数注入和接口注入。由于接口注入需要额外声明一个接口,增加了类的数目,而且它的效果和属性注入并无本质区别,因此我们不提倡采用这种方式。

三种注入方式的区别:
1.属性注入方式:对于需要注入的东西比较明确。符合java的设计规则。更适合java开发人员,使用起来更加自然,更加方便。
2.构造函数注入方式:在类加载的时候,就已经注入依赖的组件。但是若是参数多的话,使用起来不方便。
3.接口注入:组件需要依赖特定接口的实现,其中的加载接口实现和接口实现的具体对象都是由容器来完成。由于需要额外声明一个接口,增加了类的数目,而且它的效果和属性注入并无本质区别,因此我们不提倡采用这种方式。

资源准备

1:jar包下载地址:spring jar包
2.详细学习参考spring参考手册spring参考手册

示例

我们使用set注入的方法来实现一个例子,示例的过程见左侧的“示例展示”,下面是源码:
首先建立一个设备接口IDeviceWriter类

1 package demoinfo.spring.ioc;
2
3 /**
4  * 设备接口
5  */
6 public interface IDeviceWriter {
7     public void saveToDevice();
8 }    

再建立2个设备类
软盘类

 1 package demoinfo.spring.ioc;
 2
 3 /**
 4  * 软盘类
 5  */
 6 public class FloppyWriter implements IDeviceWriter {
 7     public void saveToDevice() {
 8         System.out.println("储存至软盘…");
 9     }
10 } 

USB类

 1 package demoinfo.spring.ioc;
 2
 3 /**
 4  * USB类
 5  */
 6 public class UsbDiskWriter implements IDeviceWriter {
 7     public void saveToDevice() {
 8         System.out.println("储存至移动硬盘…");
 9     }
10 } 

BusinessBean业务类

 1 package demoinfo.spring.ioc;
 2
 3 /**
 4  * 磁盘业务的业务JavaBean类
 5  */
 6 public class BusinessBean {
 7     private IDeviceWriter writer;
 8
 9     public void setDeviceWriter(IDeviceWriter writer) {
10         this.writer = writer;
11     }
12
13     public IDeviceWriter getDeviceWriter() {
14         return writer;
15     }
16
17     public void save() {
18         if (writer == null) {
19             throw new RuntimeException("DeviceWriter needed...");
20         }
21         writer.saveToDevice();
22     }
23 } 

配置文件businessFactoryConfig.xml代码如下:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
 4     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p"
 5     xmlns:context="http://www.springframework.org/schema/context"
 6     xsi:schemaLocation="http://www.springframework.org/schema/beans
 7     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
 8     http://www.springframework.org/schema/context
 9      http://www.springframework.org/schema/context/spring-context-3.0.xsd
10      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
11      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"
12      default-autowire="byName">
13
14     <bean id="floppy" class="demoinfo.spring.ioc.FloppyWriter"/>
15     <bean id="usb" class="demoinfo.spring.ioc.UsbDiskWriter"/>
16
17     <bean id="businessBean"
18           class="demoinfo.spring.ioc.BusinessBean">
19         <property name="deviceWriter">
20             <ref bean="usb"/>
21         </property>
22     </bean>
23
24 </beans>

最后测试类代码如下:

 1 package demoinfo.spring.ioc;
 2
 3 import org.springframework.context.ApplicationContext;
 4 import org.springframework.context.support.ClassPathXmlApplicationContext;
 5
 6 public class SpringDemo {
 7     public static void main(String[] args) {
 8         //获得Spring中定义的Bean实例(对象)
 9         ApplicationContext context = new ClassPathXmlApplicationContext(
10         "classpath:demoinfo/spring/ioc/businessFactoryConfig.xml ");
11         BusinessBean business = (BusinessBean) context.getBean("businessBean");
12         business.save();
13     }
14 }    

时间: 2024-10-01 04:41:50

Spring IOC整理的相关文章

Spring?IOC设计原理解析:本文乃学习整理参考而来

Spring IOC设计原理解析:本文乃学习整理参考而来 一. 什么是Ioc/DI? 二. Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三. IoC容器的初始化 1. XmlBeanFactory(屌丝IOC)的整个流程 2. FileSystemXmlApplicationContext 的IOC容器流程 1.高富帅IOC解剖 2. 设置资源加载器和资源定位 3.AbstractApplicationContext的refresh函数载入

Spring Ioc知识整理

Ioc知识整理(一): IoC (Inversion of Control) 控制反转. 1.bean的别名 我们每个bean元素都有一个id属性,用于唯一标识实例化的一个类,其实name属性也可用来标识一个类,我们还可以通过</alias>元素来给一个bean起一个别名: <bean name="doSpring" class="com.xiaoluo.spring.DoSpring"> </bean> <alias na

Spring -- IOC/DI 基础概念的理解

Spring -- IOC/DI 基础概念 思维导图: ------------------------------------------------------- IoC/DI 的基本概念 IoC是什么 ? IoC -- Inversion of control, 控制反转   在Java开发中,IoC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制.IoC是一种让服务消费者不直接依赖于服务提供者的组件设计方式,是一种减少类与类之间依赖的设计原则. 理解IoC的关键是明

Spring:源码解读Spring IOC原理

Spring IOC设计原理解析:本文乃学习整理参考而来 一. 什么是Ioc/DI? 二. Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三. IoC容器的初始化 1. XmlBeanFactory(屌丝IOC)的整个流程 2. FileSystemXmlApplicationContext 的IOC容器流程 1.高富帅IOC解剖 2. 设置资源加载器和资源定位 3.AbstractApplicationContext的refresh函数载入

Spring:源码解读Spring IOC原理--(转载)

转自:http://www.cnblogs.com/ITtangtang/p/3978349.html 这篇文章个人觉得整理的很不错,很值得学习,为了方便自己学习和大家学习,特转载此文保留.请尊重原创~~ Spring IOC设计原理解析:本文乃学习整理参考而来 一. 什么是Ioc/DI? 二. Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三. IoC容器的初始化 1. XmlBeanFactory(屌丝IOC)的整个流程 2. FileS

Spring IOC原理解读 面试必读

Spring IOC设计原理解析:本文乃学习整理参考而来 一. 什么是Ioc/DI? 二. Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三. IoC容器的初始化 1. XmlBeanFactory(屌丝IOC)的整个流程 2. FileSystemXmlApplicationContext 的IOC容器流程 1.高富帅IOC解剖 2. 设置资源加载器和资源定位 3.AbstractApplicationContext的refresh函数载入

Spring IoC/DI

前言 假设项目层次划分包括logic层和dao层,logic层调用dao层完成业务逻辑,dao层一般与数据库交互.定义两个组件,TestLogic和TestDao,分别操作接口ILogic和IDao,这样程序开发时需要考虑怎样管理这两个组件. 传统方式 这种方式中,当TestLogic组件需要调用TestDao组件时,直接使用关键字new IDao testDao = new TestDao(); 这种方式简单直观,但造成了对外部组件的严重依赖,程序高度耦合,效率低下.当项目需要更换组件时需要修

手把手教你实现Spring ioc

手把手教你实现Spring ioc "Don't call us, we'll call you(不要联系我,我会主动联系你)" 这是好莱坞很经典的一句话,应用在ioc(控制反转)领域,发现理解起来相得益彰--你作为用户不需要控制业务实体的生成,交给我容器来控制,这就是控制反转.不过,这样理解起来也有点麻烦,套用面向对象大师Martin Fowler的说法更为贴切: "Dependency Inversion(依赖注入)" 当容器中所有的实体bean 都被管理起来的

Spring IOC的实现

来源:知乎 https://www.zhihu.com/question/21035417/answer/142858103 著作权归作者所有. Spring IOC的实现部分,主要分为三个部分: 第一步: Resouce:首先我们需要获取beanDefinition的资源,我们将通过Spring的resource接口获得bean的资源,这一步也叫做bean资源的定位,下面是Spring内置的一些典型实现,当然,你也可以根据自己的需要实现自己的resource: ClassPathResourc