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类
package demoinfo.spring.ioc; /**
* 设备接口
*/
public interface IDeviceWriter {
public void saveToDevice();
}
再建立2个设备类
软盘类
package demoinfo.spring.ioc; /**
* 软盘类
*/
public class FloppyWriter implements IDeviceWriter {
public void saveToDevice() {
System.out.println("储存至软盘…");
}
}
USB类
package demoinfo.spring.ioc; /**
* USB类
*/
public class UsbDiskWriter implements IDeviceWriter {
public void saveToDevice() {
System.out.println("储存至移动硬盘…");
}
}
BusinessBean业务类
package demoinfo.spring.ioc; /**
* 磁盘业务的业务JavaBean类
*/
public class BusinessBean {
private IDeviceWriter writer; public void setDeviceWriter(IDeviceWriter writer) {
this.writer = writer;
} public IDeviceWriter getDeviceWriter() {
return writer;
} public void save() {
if (writer == null) {
throw new RuntimeException("DeviceWriter needed...");
}
writer.saveToDevice();
}
}
配置文件businessFactoryConfig.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" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p"
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/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"
default-autowire="byName"> <bean id="floppy" class="demoinfo.spring.ioc.FloppyWriter"/>
<bean id="usb" class="demoinfo.spring.ioc.UsbDiskWriter"/> <bean id="businessBean"
class="demoinfo.spring.ioc.BusinessBean">
<property name="deviceWriter">
<ref bean="usb"/>
</property>
</bean> </beans>
最后测试类代码如下:
package demoinfo.spring.ioc; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpringDemo {
public static void main(String[] args) {
//获得Spring中定义的Bean实例(对象)
ApplicationContext context = new ClassPathXmlApplicationContext(
"classpath:demoinfo/spring/ioc/businessFactoryConfig.xml ");
BusinessBean business = (BusinessBean) context.getBean("businessBean");
business.save();
}
}
Spring IOC整理的更多相关文章
- Spring IOC设计原理解析:本文乃学习整理参考而来
Spring IOC设计原理解析:本文乃学习整理参考而来 一. 什么是Ioc/DI? 二. Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三. I ...
- 整理在Spring IOC容器初始化后可以处理特定逻辑的多种实现方式
Spring框架的核心是依赖注入.切面:Spring Boot是在Spring框架的基础上为其提供许多默认配置.默认约定(约定优于配置),从而达到减少或减化配置进而可开箱即用.快速上手:Spring ...
- Spring:笔记整理(2)——IOC容器
IOC容器 什么是IOC 说明 IOC ,全称Inversion of control,即,控制反转,是一种设计思想. 控制: 在Java中,IOC意味着:你将设计好的对象交给容器控制,而不是传统的在 ...
- Spring:源码解读Spring IOC原理
Spring IOC设计原理解析:本文乃学习整理参考而来 一. 什么是Ioc/DI? 二. Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三. I ...
- 对Spring IoC容器实现的结构分析
本文的目标:从实现的角度来认识SpringIoC容器. 观察的角度:从外部接口,内部实现,组成部分,执行过程四个方面来认识SpringIoC容器. 本文的风格:首先列出SpringIoC的外部接口及内 ...
- Spring IOC(四)总结
目录 1.spring容器中Bean生命周期 2.IOC容器中核心接口 3.IOC容器启动流程 4.IOC依赖注入流程 =============正文分割线================== Spr ...
- J2EE进阶(十四)超详细的Java后台开发面试题之Spring IOC与AOP
J2EE进阶(十四)超详细的Java后台开发面试题之Spring IOC与AOP 前言 搜狐畅游笔试题中有一道问答题涉及到回答谈谈对Spring IOC与AOP的理解.特将相关内容进行整理. ...
- Spring IOC知识点一网打尽!
前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 单例模式你会几种写法? 工厂模式理解了没有? 在刷Spring书籍的时候花了点时间去学习了单例模式和工厂模式,总 ...
- Spring IOC(四)总结升华篇
本系列目录 Spring IOC(一)概览 Spring IOC(二)容器初始化 Spring IOC(三)依赖注入 Spring IOC(四)总结升华 =============正文分割线===== ...
随机推荐
- iOS开发——开发必备OC篇&UITableView设置界面完整封装(一)
UITableView设置界面完整封装(一) 简单MVC实现UITableView设置界面分组数据显示 一:模型 1:cell模型 /** 描述cell图片 */ @property (nonatom ...
- 模块化JavaScript设计模式(一)
在可扩展JavaScript的世界里,假设我们说一个应用程序是模块化(modular)的,那么通常意味着它是由一系列存储于模块中的高度解耦,不同的功能片段组成. 在可能的情况下.通过一处依赖性.松耦合 ...
- C++面试题:list和vector有什么区别?
原文:http://genwoxuevc.blog.51cto.com/1852984/503337 C++面试题:list和vector有什么区别?考点:理解list和vector的区别出现频率:★ ...
- php对比辨析之 mysql_escape_string & mysql_real_escape_string & addsalshes
概述: addslashes和mysql_real_escape_string.都是为了使数据安全的插入到数据库中而进行过滤. addslashes 转义的字符是单引号(').双引号("). ...
- curl模拟Http请求
一.get请求 curl "http://www.baidu.com" 如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地 curl -i "http://w ...
- Wcf 之 配置文件解析
在WCF Service Configuration Editor的使用中,我们通过配置工具自动生成了WCF服务端的config文件.现在我们来看下这个配置文件各个标签的意义(解释在下面xml文件中的 ...
- solrj:org.apache.solr.common.util.NamedList.java
package org.apache.solr.common.util; import java.io.Serializable; import java.util.ArrayList; import ...
- 创建对象_工厂方法(Factory Method)模式 与 静态工厂方法
工厂方法模式: 定义:为创建对象定义一个接口,让子类决定实例化哪个类.工厂方法让一个类的实例化延迟至子类. 应用场景: 客户类不关心使用哪个具体类,只关心该接口所提供的功能: 创建过程比较 ...
- iOS 程序启动原理
很多工作一段时间的iOS程序员,总是每天沉浸在代码里,大家总是按照xcode的规定生成项目,然后就开始码代码了,但是大家知道app背后的启动过程吗?当点击程序图标启动程序开始到退出,程序在运行过程中到 ...
- 【WinAPI】User32.dll注释
#region User32.dll 函数 /// <summary> /// 该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄,以后可以在GDI函数中使用该句柄来在设备 ...