控制反转(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容器的理解的更多相关文章

  1. spring in action 学习笔记三:对spring 容器的理解,以及如何利用AnnotationConfigApplicationContext这个容器创建对象

    一:spring的容器就是bean所居住的地点,这个居民点有很多的bean,有外来的bean(相当于创建了一个bean),有出去谋生的(相当于消亡了一个bean),他们之间都有某种联系 (bean与b ...

  2. 理解Spring 容器、BeanFactory 以及 ApplicationContext

    一.spring 容器理解 spring 容器可以理解为生产对象(Object)的地方,在这里容器不只是帮助我们创建对象那么简单,它负责了对象的整个生命周期-创建.装配.销毁.而这里对象的创建管理的控 ...

  3. Spring容器、BeanFactory和ApplicationContext,及3种装配Bean的方式

    目录 一. spring容器理解 二. BeanFactory和ApplicationContext之间的关系 三. BeanFactory详情介绍 四.ApplicationContext介绍 五. ...

  4. 通过单元测试理解spring容器以及dubbo+zookeeper单元测试异常处理

    一.先说一个结论:单元测试与主项目的spring容器是隔离的,也就是说,单元测试无法访问主项目spring容器,需要自己加载spring容器. 接下来是代码实例,WEB主项目出于运行状态,单元测试中可 ...

  5. Spring基础篇——Spring容器和应用上下文理解

    上文说到,有了Spring之后,通过依赖注入的方式,我们的业务代码不用自己管理关联对象的生命周期.业务代码只需要按照业务本身的流程,走啊走啊,走到哪里,需要另外的对象来协助了,就给Spring说,我想 ...

  6. spring容器和上下文的理解

    spring容器和上下文的理解 spring框架现在使用的很多,这说明有其独特之处----依赖注入,很简单的四个字,在我们需要对象的时候,spring就可以给我们提供所需要的对象,对象的创建.销毁.管 ...

  7. 资深程序员总结:彻底理解Spring容器和应用上下文

    点关注,不迷路:持续更新Java架构相关技术及资讯热文!!! 有了Spring之后,通过依赖注入的方式,我们的业务代码不用自己管理关联对象的生命周期.业务代码只需要按照业务本身的流程,走啊走啊,走到哪 ...

  8. spring容器启动过程理解

    一.一切从手动启动IoC容器开始 ClassPathResource resource = new ClassPathResource("bean.xml"); DefaultLi ...

  9. 转: 彻底理解 Spring 容器和应用上下文

    本文由 简悦 SimpRead 转码, 原文地址 https://mp.weixin.qq.com/s/o11jVTJRsBi998WlgpfrOw 有了 Spring 之后,通过依赖注入的方式,我们 ...

随机推荐

  1. SQL必知必会03 计算字段 获取当前日期时间 日期时间格式化

  2. E. Cyclic Components (DFS)(Codeforces Round #479 (Div. 3))

    #include <bits/stdc++.h> using namespace std; *1e5+; vector<int>p[maxn]; vector<int&g ...

  3. 持续集成~Jenkins里的NuGet和MSBuild插件

    Jenkins是一个持续集成的环境,它是java开发的,大叔认为它的工作流程是 从源代码拉一个项目下来到它本地(可以配置定时机制) 恢复相关程序包nuget 编译程序 发布程序 现在说一下在配置jen ...

  4. MySQL在远程访问时非常慢的解决skip-name-resolve

    服务器放在局域网内进行测试时,数据库的访问速度还是很快.但当服务器放到外网后,数据库的访问速度就变得非常慢. 后来在网上发现解决方法,my.cnf里面添加 [mysqld] skip-name-res ...

  5. display flex在部分低级android中的支付宝窗口表现

    display flex用在移动端布局 当该元素是inline元素如span的时候回出现无宽高的情况,需要增加display:block: 他的子元素如果是inline元素那么也同样会出现这个问题,需 ...

  6. 一起来学Spring Cloud | 第三章:服务消费者 (负载均衡Ribbon)

    一.负载均衡的简介: 负载均衡是高可用架构的一个关键组件,主要用来提高性能和可用性,通过负载均衡将流量分发到多个服务器,多服务器能够消除单个服务器的故障,减轻单个服务器的访问压力. 1.服务端负载均衡 ...

  7. intelliJ idea 下载安装

    Intellij IDEA是公认的java开发最好的工具,必须学会. 1. 打开网址 https://www.jetbrains.com/ 2. 点击 Intellij IDEA 图标连接,如下图 3 ...

  8. jsp实现账户登录、注册!

    jsp连接mysql数据库进行账户登录验证和账户注册 ~jsp: Login.jsp .LoginCl.jsp.Welcome.jsp.Register.jsp.login.css login.css ...

  9. SQLServer外键查询删除信息

    SELECT FK.NAME,FK.OBJECT_ID,OBJECT_NAME(FK.PARENT_OBJECT_ID) AS REFERENCETABLENAMEFROM SYS.FOREIGN_K ...

  10. poj1338 Ugly Numbers 打表, 递推

    题意:一个数的质因子能是2, 3, 5, 那么这个数是丑数. 思路: 打表或者递推. 打表: 若该数为丑数,那么一定能被2 或者3, 或者5 整除, 除完之后则为1. #include <ios ...