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 之后,通过依赖注入的方式,我们 ...
随机推荐
- Android NFC 整理
Android NFC基础(多篇) http://blog.csdn.net/think_soft/article/details/8169483
- Codeforces 1139D(推式子+dp)
题目传送 推公式博客传送 推完式子就是去朴素地求就行了Orz const int maxn = 1e5 + 5; const int mod = 1e9 + 7; int m, mu[maxn], v ...
- Curious Array Codeforces - 407C(高阶差分(?)) || sequence
https://codeforces.com/problemset/problem/407/C (自用,勿看) 手模一下找一找规律,可以发现,对于一个修改(l,r,k),相当于在[l,r]内各位分别加 ...
- 运用session来控制用户的异地登录被挤下线情况
在用QQ的过程中我们如果你的账号在另外一台手机上面登录,这是腾讯后台会提醒你异地登录,可能你的账号被盗了,然后你手机上得QQ就会被退出登录,这个时候你就需要重新登录修改密码,以确保账号的安全.那这种被 ...
- SNMP消息传输机制
1.引言 基于TCP/IP的网络管理包含3个组成部分: 1) 一个管理信息库MIB(Management Information Base).管理信息库包含所有代理进程的所有可被查询和修改的参数.RF ...
- Android 仿微信朋友圈发表图片拖拽和删除功能
朋友圈实现原理 我们使用 Android Device Monitor 来分析朋友圈发布图片的界面实现原理.如果需要分析其他应用的界面实现也是采用这种方法哦. 打开 Android Device Mo ...
- (转)ASIC设计中各个阶段需要注意的问题——节选
ASIC 的复杂性不断提高,同时工艺在不断地改进,如何在较短的时间内开发一个稳定的可重用的ASIC芯片的设计,并且一次性流片成功,这需要一个成熟的ASIC 的设计方法和开发流程.本文结合NCveril ...
- IOS之UI异步刷新
NSOperationQueue *operationQueue; // for rendering pages on second thread [operationQueue waitUn ...
- vue+element ui项目总结点(四)零散细节概念巩固如vue父组件调用子组件的方法、拷贝数据、数组置空问题 等
vue config下面的index.js配置host: '0.0.0.0',共享ip (假设你的电脑启动了这个服务我电脑一样可以启动)-------------------------------- ...
- Servlet和JSP之自定义标签学习
此文章会讲述简单标签处理器,因为经典自定义标签处理器没有简单标签处理器方便使用,故在此不进行描述. 参考:慕课网的<JSP自定义标签>视频; <Servlet.JSP和Sprin ...