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 之后,通过依赖注入的方式,我们 ...
随机推荐
- BZOJ2152聪聪可可
bzoj传送门 luogu传送门 这题算是很sb的点分治了,最近在点分治复习,写了练练手,对于这个题只需要对统计0,1,2出现的次数就好了吧,然后发现答案不对,也就是每个点对需要算两遍嘛,0也算,所以 ...
- PostgreSQL-12-数据导入与导出
1.数据导入 - COPY FROM CREATE DATABASE c04_datacleaning; \c c04_datacleaning 创建新的数据库 COPY table_name [ ( ...
- IP服务-2-RARP和BOOTP
ARP和代理ARP进程都是在一台主机知道了自己的IP地址和子网掩码后发生的.RARP.BOOTP和DHCP则代表了一类协议的发展,这类协议用来帮助主机动态地学习自己的IP地址.
- [题解](数学)BZOJ_1257_余数求和
来源:https://blog.csdn.net/loi_dqs/article/details/50522975 并不知道为什么是sqrt(n)的段数......书上写的看不懂...... 但是这个 ...
- JAVA常用知识总结(十一)——数据库(一)
项目中用到的不常见sql语法 1:空值不在前的排序 select a.* from WZX_SCZY A order by SCZY_START_TIME desc nulls last (不加nul ...
- 在SpringBoot中用SpringAOP实现日志记录功能
背景: 我需要在一个SpringBoot的项目中的每个controller加入一个日志记录,记录关于请求的一些信息. 代码类似于: logger.info(request.getRequestUrl( ...
- kafka基础五
Kafka与Zookeeper Zookeeper存储了什么 kafka架构中角色: 1.producer: 消息生产者,发布消息到 kafka 集群的终端或服务. 2.broker: kafka 集 ...
- 关于RegExp的一些使用的练习(代码加注释)
<!DOCTYPE html> <html> <head> <title>title</title> <meta charset=&q ...
- CommonJS与ES6、AMD、CMD比较
Javascript,javascript是一种脚本编程语言,有自己独立的语法与语义,没有javascript,也就没有其他的那些概念了. 关于ES6,可直接理解为javascript的增强版(增加了 ...
- cvCanny的参数
cvCanny 函数功能:采用Canny方法对图像进行边缘检测 函数原型: void cvCanny( const CvArr* image, CvArr* edges, double thresho ...