Spring容器的理解
控制反转(IOC,Inversion Of Contorl)和依赖注入(DI,Dependency Injection)
IOC是一个宽泛的概念:对某事物的控制权由A转移到B。
DI是实现IOC的一种实现,实现的方式是:A依赖X,B就通过注入的方式将X给A,而不需要A自己去获取或者创建X。在这个情况下,X的控制权就由A转移到B这里了,也就是实现了IOC。
(ps:DL,Dependency Lookup,依赖查找也是IOC的一种实现,如spring中的context.getBean(XX.class))
举个生活中的例子:前台收到你的快递,而你在工位上写代码。一般这个时候,自己会停下手里的工作,到前台把快递拿回来。而对于使用了依赖注入的情况就是,你将拿快递的控制权交给前台,让她拿过来给你,这时候自己就方便多了。
再举一个代码相关的例子(为了简化,没有使用接口):
Shell shell = new Shell(); Wheel wheel = new Wheel(); Car car = new Car(shell, wheel);car.run();
需要什么,就自己去创建什么,最后都装配到一起使用,核心的业务逻辑就是一行 run,却多写了好多行装配代码(依赖关系复杂的情况下代码更多),而使用了DI的情况,配置好了依赖关系之后,在代码中:
@Autowired Car car;
也就是,在代码中就可以省略了处理依赖关系的代码,可以使开发人员更加专注于业务逻辑。
其实,程序的复杂度并没有凭空消失,该new的还是要new,该装配的还是要装配。只是原来混杂在业务逻辑中,使用DI之后就转移到了容器中而已。有人可能会说,实现“转移”不需要用Spring容器,大可以自己写一个工具类,里面专门用来new对象、装配对象,然后通过反射的方式将装配好的对象注入(或者通过业务类的setter注入所需的对象)到业务代码中。这样做绝对没问题,这样做变相地就是自己实现了一个容器功能,多麻烦。既然有个现成的Spring容器就直接用了吧。
可以看出使用DI的优势就是方便。反过来思考,在一个spring应用中,假如让你不使用容器注入,自己可以实践一下,就知道手动处理依赖关系有多麻烦了。
Spring容器的理解的更多相关文章
- spring in action 学习笔记三:对spring 容器的理解,以及如何利用AnnotationConfigApplicationContext这个容器创建对象
一:spring的容器就是bean所居住的地点,这个居民点有很多的bean,有外来的bean(相当于创建了一个bean),有出去谋生的(相当于消亡了一个bean),他们之间都有某种联系 (bean与b ...
- 理解Spring 容器、BeanFactory 以及 ApplicationContext
一.spring 容器理解 spring 容器可以理解为生产对象(Object)的地方,在这里容器不只是帮助我们创建对象那么简单,它负责了对象的整个生命周期-创建.装配.销毁.而这里对象的创建管理的控 ...
- Spring容器、BeanFactory和ApplicationContext,及3种装配Bean的方式
目录 一. spring容器理解 二. BeanFactory和ApplicationContext之间的关系 三. BeanFactory详情介绍 四.ApplicationContext介绍 五. ...
- 通过单元测试理解spring容器以及dubbo+zookeeper单元测试异常处理
一.先说一个结论:单元测试与主项目的spring容器是隔离的,也就是说,单元测试无法访问主项目spring容器,需要自己加载spring容器. 接下来是代码实例,WEB主项目出于运行状态,单元测试中可 ...
- Spring基础篇——Spring容器和应用上下文理解
上文说到,有了Spring之后,通过依赖注入的方式,我们的业务代码不用自己管理关联对象的生命周期.业务代码只需要按照业务本身的流程,走啊走啊,走到哪里,需要另外的对象来协助了,就给Spring说,我想 ...
- spring容器和上下文的理解
spring容器和上下文的理解 spring框架现在使用的很多,这说明有其独特之处----依赖注入,很简单的四个字,在我们需要对象的时候,spring就可以给我们提供所需要的对象,对象的创建.销毁.管 ...
- 资深程序员总结:彻底理解Spring容器和应用上下文
点关注,不迷路:持续更新Java架构相关技术及资讯热文!!! 有了Spring之后,通过依赖注入的方式,我们的业务代码不用自己管理关联对象的生命周期.业务代码只需要按照业务本身的流程,走啊走啊,走到哪 ...
- spring容器启动过程理解
一.一切从手动启动IoC容器开始 ClassPathResource resource = new ClassPathResource("bean.xml"); DefaultLi ...
- 转: 彻底理解 Spring 容器和应用上下文
本文由 简悦 SimpRead 转码, 原文地址 https://mp.weixin.qq.com/s/o11jVTJRsBi998WlgpfrOw 有了 Spring 之后,通过依赖注入的方式,我们 ...
随机推荐
- sql 语句 替换字段的一些内容
update t_table set field = replace(field,'替换内容','替换为');
- python多线程Event实现红绿灯案例
代码: # __author__ = 'STEVEN' # coding = utf-8 import time,threading #开启事件 event = threading.Event() c ...
- UItableView动态行高 用这两句实现(可以自己计算数据来实现,一般在model中计算)
// 动态行高 self.tableView.rowHeight = UITableViewAutomaticDimension; // 预估行高 self.tableView.estimatedRo ...
- 洛谷 P1094 纪念品分组
P1094 纪念品分组 先按价格对纪念品排序(这里是从大到小),然后从两端向中心开始配对,有两个变量i和j,表示正在处理的两个纪念品编号,开始时i=1,j=n,如果a[i]+a[j]>w则第i贵 ...
- 利用Common-Fileupload上传文件图片
一,介绍 common-fileupload是appache的开源组件,基于该组件可以轻松实现文件上传的功能,strust框架的文件上传功能也是基于该组件. 二,使用 1,导入两个jar包:commo ...
- 102 Binary Tree Level Order Traversal 二叉树的层次遍历
给定一个二叉树,返回其按层次遍历的节点值. (即zhu'ceng'de,从左到右访问).例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 ...
- [已读]JavaScript模式
主要是介绍各种继承和设计模式.第一章是讲编程规范,然后里面讲到了使用new Function替代eval
- JavaScript Allongé 第一呷 :基础函数 (3) 未完
闭包与域是时候来看下一个带函数的函数是如何工作的: (function (x) { return function (y) { return x } })(1)(2) //=> 1 首先,我们使 ...
- python学习day13
目录 JavaScript Dom jQuery JavaScript JavaScript 是世界上最流行的编程语言. 这门语言可用于 HTML 和 web,更可广泛用于服务器.PC.笔记本电脑.平 ...
- Ubuntu16.04 + cuda8.0 + GTX1080安装教程
1. 安装Ubuntu16.04 不考虑双系统,直接安装 Ubuntu16.04,从 ubuntu官方 下载64位版本: ubuntu-16.04-desktop-amd64.iso . 在MAC下制 ...