spring ioc原理

IOC(DI):java程序员都知道:java程序中的每个业务逻辑 至少需要两个或以上的对象来协作完成,通常,每个对象在使用他的合作对象时,自己均要使用像new object() 这样的语法来完成合作对象的申请工作。你会发现:对象间的耦合度高了。而IOC的思想是:Spring容器来实现这些相互依赖对象的创建、协调工作。对象 只需要关系业务逻辑本身就可以了。从这方面来说,对象如何得到他的协作对象的责任被反转了(IOC、DI)。

 

IoC与DI

  首先想说说IoC(Inversion of Control,控制倒转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然后打听她们的兴趣爱好、qq号、电话号、ip号、iq号………,想办法认识她们,投其所好送其所要,然后嘿嘿……这个过程是复杂深奥的,我们必须自己设计和面对每个环节。传统的程序开发也是如此,在一个对象中,如果要使用另外的对象,就必须得到它(自己new一个,或者从JNDI中查询一个),使用完之后还要将对象销毁(比如Connection等),对象始终会和其他的接口或类藕合起来。

  那么IoC是如何做的呢?有点像通过婚介找女朋友,在我和女朋友之间引入了一个第三者:婚姻介绍所。婚介管理了很多男男女女的资料,我可以向婚介提出一个列表,告诉它我想找个什么样的女朋友,比如长得像李嘉欣,身材像林熙雷,唱歌像周杰伦,速度像卡洛斯,技术像齐达内之类的,然后婚介就会按照我们的要求,提供一个mm,我们只需要去和她谈恋爱、结婚就行了。简单明了,如果婚介给我们的人选不符合要求,我们就会抛出异常。整个过程不再由我自己控制,而是有婚介这样一个类似容器的机构来控制。Spring所倡导的开发方式就是如此,所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。如果你还不明白的话,我决定放弃。

IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢? Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。关于反射的相关资料请查阅java doc。

 

原文链接 http://blog.csdn.net/it_man/article/details/4402245

转载于:https://www.cnblogs.com/xmyclass/articles/4651547.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五种I/O 模式——阻塞(默认IO模式),非阻塞(常用语管道),I/O多路复用(IO多路复用的应用场景),信号I/O,异步I/O

From: http://blog.163.com/xychenbaihuyeah/blog/static/13222965520112163171778/ 五种I/O 模式: 【1】 阻塞 I/O (Linux下的I/O操作默认是阻塞I/O,即open和socket创建的I/O都是阻塞I/O) 【2】 非阻塞 I/O (可以通过f…

【hive】Hive中的大宽表及其底层详细技术点

简介: 在大数据环境中,处理大规模数据集是常见的需求。为了满足这种需求,Hive引入了大宽表(Large Wide Table)的概念,它是一种在Hive中管理和处理大量列的数据表格。本文将详细介绍Hive中的大宽表概念以及其底层的详细…

[react] render函数中return如果没有使用()会有什么问题?

[react] render函数中return如果没有使用()会有什么问题? 我们在使用JSX语法书写react代码时,babel会将JSX语法编译成js,同时会在每行自动添加分号(;),如果return后换行了,那么就会…

小程序tabbar文字在服务器上不显示,小程序的tabbar不显示

1. tabbar 不显示刚开始给页面加tabbar时{"pages":["pages/index/index","pages/all/all","pages/relax/relax","pages/me/me","pages/wen/wen","pages/logs/logs"],"window":{"backgro…

Linux fprintf的用法

一、fprintf 函数描述 fprintf其作用是格式化打印,也叫格式化输出,可以指定输出到一个流文件中,即相输出流中写入数据。fprintf()函数根据指定的格式(format),向输出流(stream)写入数据(argument)。fprintf( )会根据参数format 字…

2015 7 18

ExecuteNonQuery返回的是受影响的行数ExecuteScalar返回的是第一行第一列的值 制作密码找回的冻结功能 一个变量 当点击提交密码问题答案时1 达到3次时 数据库中的时间项纪录为当前时间 返回首页 执行找回密码操作时 点击下一步 先进行判定 如果用户名存在 其当前日期-冻…

windows组件向导里没有internet 信息服务(iis) 的解决办法

From: http://blog.163.com/red419126/blog/static/18862284200882155215627/ 电脑要重装系统,借同事的xp光盘,一切顺利。却发现这个新系统添加删除组件向导里没有iis了。怎么办呢? 在运行中输入"c:\windows\inf\sysoc.inf"&…

Linux tm time_t timeval timespec以及与时间相关函数用法

一、时间类型 linux中编程通常需要用到时间变量&#xff0c;和相关的时间操作函数。常用的时间类型有&#xff1a; time_t 、struct timeval、struct timespec、struct tm。 在用到相关的类型和函数时&#xff0c;需要加上头文件&#xff1a;#include <time.h> …

Apache的prefork模式和worker模式

prefork模式 这个多路处理模块(MPM)实现了一个非线程型的、预派生的web服务器&#xff0c;它的工作方式类似于Apache 1.3。它适合于没有线程安全库&#xff0c;需要避免线程兼容性问题的系统。它是要求将每个请求相互独立的情况下最好的MPM&#xff0c;这样若一个请求出现问题就…

[react] 说说Context有哪些属性?

[react] 说说Context有哪些属性&#xff1f; context属于一种解决组件间层级过多传递数据的问题&#xff0c;避免了层层嵌套的通过props传递的形式&#xff0c;同时对于不需要使用到redux时&#xff0c;是一种解决方案&#xff0c;关于组件的复用性变差的问题&#xff0c;我觉…

艾泰路由器设置虚拟服务器,艾泰路由器设置步骤

艾泰路由器设置步骤艾泰科技路由器默认配置完之后就可以上网&#xff0c;内网私网地址通过WAN口的"NAT转换来上网。但某些特殊时候却不需要NAT模式&#xff0c;用户需要纯路由模式来转发&#xff0c;下面是小编整理的相关内容&#xff0c;欢迎阅读参考&#xff01;ReOS V2…

ubuntu 安装(install) pwntcha[一个做验证码识别的开源程序]

一、安装 1. sudo apt-get install libsdl1.2-dev libsdl1.2debian sudo apt-get install libsdl1.2-dev(比较大&#xff0c;10M左右) sudo apt-get install libsdl-image1.2-dev sudo apt-get install libsdl-mixer1.2-dev sudo apt-get install libsdl-ttf2.0-dev sudo apt-g…

IIS出现The specified module could not be found解决方法

From: http://www.cnblogs.com/hanxianlong/archive/2008/10/25/1319269.html 打开IIS 信息服务&#xff0c;在左侧找到自己的计算机&#xff0c;点右键&#xff0c;选择属性&#xff0c;在主属性中选编辑&#xff0c;打开“目录安全性”选项卡&#xff0c;单击“匿名访问和验…

嵌入式开发中模拟SPI的驱动

这里贴一下自己的模拟SPI驱动&#xff0c;移植的话需要实现SPI管脚的定义和初始化。 一、管脚初始化 MOSI_PIN&#xff1a;设置MOSI为输出模式SCK_PIN&#xff1a;设置SCK为输出模式CSN_PIN&#xff1a;设置CSN为输出模式MISO_PIN&#xff1a;设置MISO为输入模式MOSI_PIN_HIG…

开始整理资料

现在想想为什么这么晚才在CSDN安家&#xff0c;如果大一的时候就开始写博客了&#xff0c;记录生活的点点滴滴&#xff0c;那该有多好。 回去以前做过的许多事情&#xff0c;总是一知半解&#xff0c;如果当时能够想到写博客&#xff0c;那么理解程度就不是现在这个样子了。 知…

[react] 你有使用过React Intl吗?

[react] 你有使用过React Intl吗&#xff1f; 一种react国际化的解决方案 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题 个人简介 我是歌谣&#xff0c;欢迎和…

C语言编程对缓冲区的理解

解析C语言编程对缓冲区的理解 转载自&#xff1a;http://soft.chinabyte.com/database/47/12481547.shtml 下面介绍缓冲区的知识。 一、什么是缓冲区 缓冲区又称为缓存&#xff0c;它是内存空间的一部分。也就是说&#xff0c;在内存空间中预留了一定的存储空间&#xff0c;这些…

ftp文档服务器设置,ftp服务器基本设置

ftp服务器基本设置 内容精选换一换在迁移Agent中输入华为云账号AK/SK以后&#xff0c;AK/SK校验失败。Windows系统提示用户&#xff1a;"AK/SK authentication failed. Ensure that the system time is consistent with the standard time and the AK and SK are corre服务…

浅谈进程间的消息传递

From: http://blog.csdn.net/handsomewang527/article/details/1676259 随着我们开发的应用的日益复杂&#xff0c;像以往那样将所有功能坐在一个exe文件中情况越来越少&#xff0c;更多时候是整个应用由若干模块、甚至若干单独的exe文件组成&#xff0c;这就涉及到了模块或进…

树莓派移植SX1278 LoRa通信--使用wiringPiSPI移植SPI通信接口

一、SPI接口 树莓派3B上的SPI接口如下所示&#xff0c;有两组SPI&#xff0c;分别由CE0和CE1来进行选择。 首先查看树莓派的SPI是否启用&#xff0c;在/dev查看是否有spidev0.0和spidev0.1 如果不存在spi设备号&#xff0c;需要在raspi-config中启用&#xff0c;在命令行输入&…