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 之后,通过依赖注入的方式,我们 ...
随机推荐
- 分布式通信-tcp/ip 广播
服务端 /** * 广播 */ public class MulticastServer { public static void main(String[] args) { try { //地址是2 ...
- CentOS7 adb
https://blog.csdn.net/u012700515/article/details/79021320
- tensorflow:实战Google深度学习框架第四章01损失函数
深度学习:两个重要特性:多层和非线性 线性模型:任意线性模型的组合都是线性模型,只通过线性变换任意层的全连接神经网络与单层神经网络没有区别. 激活函数:能够实现去线性化(神经元的输出通过一个非线性函数 ...
- 25 Groovy 相关资料
Groovy Homepage Groovy API page Groovy documentation Groovy Goodness blog series from Hubert Klein I ...
- Lock简介
digest synchronized已经提供了锁的功能,而且还是Java的内置特性,那为什么还要出现lock呢? 用一句话来讲就是——synchronized可以实现同步,但太死板了它的同步机制:l ...
- vs 2017注册码 激活码
Visual Studio 2017(VS2017) 企业版 Enterprise 注册码:NJVYC-BMHX2-G77MM-4XJMR-6Q8QFVisual Studio 2017(VS2017 ...
- 一文带你读懂 Mysql 和 InnoDB存储引擎
作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.PostgreSQL,但是一直以来也没有对数据库有一个非常清晰并且成体系 ...
- substring和substr,slice和splice
substring 和 substr 这二货都是针对字符串而言的,且都是返回一个副本,而不是在原字符串上直接操作. 上代码: var str = '0123456789'; console.log( ...
- hihocoder1080 更为复杂的买卖房屋姿势
思路: 线段树区间修改,需要使用两个懒标记set和add.处理好两个标记的优先级即可(set之前的set和add是没有作用的). 实现: #include <bits/stdc++.h> ...
- jquery select取option的value值发生变化事件
html代码如下所示: <div id = "schedule"> <label>是否设置:</label> <select name=& ...