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 }
View Code
再建立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 }
View Code
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 }
View Code
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 }
View Code
配置文件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>
View Code
最后测试类代码如下:
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 }
View Code
转载于:https://www.cnblogs.com/acm-bingzi/p/5809445.html
Spring IOC整理相关推荐
- Spring IoC是如何进行依赖注入的
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 依赖注入(DI) DI(Dependency Injection) ...
- spring bean加载过程_Spring源码剖析3:Spring IOC容器的加载过程
本文转自五月的仓颉 https://www.cnblogs.com/xrq730 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https ...
- Spring Ioc (Inversion of Control)
2019独角兽企业重金招聘Python工程师标准>>> 以下整理自http://jinnianshilongnian.iteye.com/blog/1413846,如有侵权立即删除. ...
- 后端:Spring IOC 知识点总结,写得太好了!
来自:潘佳琪 | 责编:乐乐 链接:segmentfault.com/a/1190000022015914 广义的 IOC 在这之前,我们先记住一句话.好莱坞原则:Don't call me, we ...
- Spring:笔记整理(1)——HelloWorld
Spring:笔记整理(1)--HelloWorld 导入JAR包: 核心Jar包 Jar包解释 Spring-core 这个jar 文件包含Spring 框架基本的核心工具类.Spring 其它组件 ...
- SpringBoot2 | Spring IOC 流程中核心扩展接口的12个扩展点源码分析(十一)
微信公众号:吉姆餐厅ak 学习更多源码知识,欢迎关注. SpringBoot2 | SpringBoot启动流程源码分析(一) SpringBoot2 | SpringBoot启动流程源码分析(二) ...
- spring ioc原理_干了5年的Java面试官,把他喜欢问的几十个Spring面试题告诉我了
前言: Spring 框架知识是互联网公司面试必考知识点.对于开发同学来说,Spring 框架熟悉又陌生. 熟悉:开发过程中无时无刻不在使用 Spring 的知识点:陌生:对于基本理论知识疏于整理与记 ...
- Spring IOC知识点一网打尽!
前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 单例模式你会几种写法? 工厂模式理解了没有? 在刷Spring书籍的时候花了点时间去学习了单例模式和工厂模式,总 ...
- 源码深度解析系列之 Spring IOC
大家好,我是黎杜,今天和大家聊聊Spring IOC的源码! 历时 4 个多月,终于把 Sping 源码系列写完了,该系列一共 5 篇,后续会整理成 PDF 教程,本文是最后一篇. 这篇文章主要讲解 ...
- 10天,几万字,源码深度解析之 Spring IOC
历时 10 天,终于把 Sping 源码系列写完了,该系列一共 5 篇,后续会整理成 PDF 教程,本文是最后一篇. 这篇文章主要讲解 IOC 容器的创建过程,让你对整体有一个全局的认识,文章没有复杂 ...
最新文章
- 15.并发工具类(解析hashtable,ConcurrentHashMap1.7与1.8的区别以及Semaphore)
- ceph-deploy出错UnableToResolveError Unable to resolve host
- 冒泡排序--通过冒泡算法让数组中最大的值成为数组中最后一个值
- 【2019暑假刷题笔记-树的遍历】总结
- 【分享】扎克伯格的26条提升效率点子
- java查看上下文加载器_线程上下文类加载器
- linux文件操作常见考题_linux试题
- Live Rate creation中的Territory check逻辑
- linux内核驱动模块开发步骤及实例入门介绍
- C++学习之路 | PTA乙级—— 1089 狼人杀-简单版(精简)
- 使用pyinstaller打包python程序时问题记录
- msu文件无法运行_安装程序遇到报错?无法验证发布者?无法使用脚本直接调用?...
- linux静态和动态路由英文,静态路由和动态路由的特点
- 向新手和不愿意尝试的童鞋推荐vim插件(转载)
- 凯恩帝数控系统面板介绍_凯恩帝数控车床操作面板按钮详解!KND1TB数控系统操作...
- MarkDown桌面版使用下载+安装+使用教程(包括全套的使用语法,欢迎大家查看)
- 【语音信号处理课程设计】基于MATLAB的隐马尔可夫和矢量量化的语音识别研究
- dnf强化卷代码_dnf强化卷叫什么名字?
- 常用的一些LDO芯片及使用
- Microsoft SQL Server认证方式的修改