IOC,控制反转的意思,DI是依赖注入


      所谓控制反转,即依赖关系的获取方式(controll)反过来了。所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B。所谓反转(inversion),你必须理解如果不反转,会怎么着,因为A必须要有B,才可以调用B,如果不反转,意思就是A主动获取B的实例:B b = new B(),这就是最简单的获取B实例的方法(当然还有各种设计模式可以帮助你去获得B的实例,比如工厂、Locator等等),然后你就可以调用b对象了。
      所以,不反转,意味着A要主动获取B,才能使用B;到了这里,你就应该明白了反转的意思了。倒置就是A要调用B的话,A并不需要主动获取B,而是由其它人自动将B送上门来。

形象的举例就是:

通常情况下,假如你有一天在家里口渴了,要喝水,那么你可以到你小区的小卖部去,告诉他们,你需要一瓶水,然后小卖部给你一瓶水!

这本来没有太大问题,关键是如果小卖部很远,那么你必须知道:从你家如何到小卖部;小卖部里是否有你需要的水;你还要考虑是否开着车去;等等等等,也许有太多的问题要考虑了。也就是说,为了一瓶水,你还可能需要依赖于车等等这些交通工具或别的工具,问题是不是变得复杂了?那么如何解决这个问题呢?

解决这个问题的方法很简单:小卖部提供送货上门服务,凡是小卖部的会员,你只要告知小卖部你需要什么,小卖部将主动把货物给你送上门来!这样一来,你只需要做两件事情,你就可以活得更加轻松自在:
      第一:向小卖部注册为会员
      第二:告诉小卖部你需要什么

是不是和spring的做法很类似呢?Spring就是小卖部,你就是A对象,水就是B对象
      第一:在Spring中声明一个类:A
      第二:告诉Spring,A需要B

假设A是UserAction类,而B是UserService类
<bean id="userService" class="org.leadfar.service.UserService"/>
<bean id="documentService" class="org.leadfar.service.DocumentService"/>
<bean id="orgService" class="org.leadfar.service.OrgService"/>

<bean id="userAction" class="org.leadfar.web.UserAction">
     <property name="userService" ref="userService"/>
</bean>

在Spring这个商店(工厂)中,有很多对象/服务:userService,documentService,orgService,也有很多会员:userAction等等,声明userAction需要userService即可,Spring将通过你给它提供的通道主动把userService送上门来,因此UserAction的代码示例类似如下所示:

package org.leadfar.web;
public class UserAction{
     private UserService userService;
     public String login(){
          userService.valifyUser(xxx);
     }
     public void setUserService(UserService userService){ 
          this.userService = userService;
     }
}

在这段代码里面,你无需自己创建UserService对象(Spring作为背后无形的手,把UserService对象通过你定义的setUserService()方法把它主动送给了你,这就叫依赖注入!)

Spring依赖注入的实现技术是:动态代理

AOP

再说说AOP,即面向切面编程,面向切面编程的目标就是分离关注点。什么是关注点呢,就是你要做的事,就是关注点。假如你是个公子哥,没啥人生目标,天天就是衣来伸手,饭来张口,整天只知道玩一件事!那么,每天你一睁眼,就光想着吃完饭就去玩(你必须要做的事),但是在玩之前,你还需要穿衣服、穿鞋子、叠好被子、做饭等等等等事情,这些事情就是你的关注点,但是你只想吃饭然后玩,那么怎么办呢?这些事情通通交给别人去干。在你走到饭桌之前,有一个专门的仆人A帮你穿衣服,仆人B帮你穿鞋子,仆人C帮你叠好被子,仆人C帮你做饭,然后你就开始吃饭、去玩(这就是你一天的正事),你干完你的正事之后,回来,然后一系列仆人又开始帮你干这个干那个,然后一天就结束了!

AOP的好处就是你只需要干你的正事,其它事情别人帮你干。也许有一天,你想裸奔,不想穿衣服,那么你把仆人A解雇就是了!也许有一天,出门之前你还想带点钱,那么你再雇一个仆人D专门帮你干取钱的活!这就是AOP。每个人各司其职,灵活组合,达到一种可配置的、可插拔的程序结构。

从Spring的角度看,AOP最大的用途就在于提供了事务管理的能力。事务管理就是一个关注点,你的正事就是去访问数据库,而你不想管事务(太烦),所以,Spring在你访问数据库之前,自动帮你开启事务,当你访问数据库结束之后,自动帮你提交/回滚事务!

转载地址:http://blog.csdn.net/li_tengfei/article/details/6106317

spring的ioc和di相关推荐

  1. Spring-学习笔记03【Spring的IOC和DI】

    Java后端 学习路线 笔记汇总表[黑马程序员] Spring-学习笔记01[Spring框架简介][day01] Spring-学习笔记02[程序间耦合] Spring-学习笔记03[Spring的 ...

  2. Spring 框架 IOC 与 DI 的总结

    一:Spring并天下 1:Spring帝国: ①:Spring崛起 什么是Spring:源于Rod Johnson在其著作<Expert one on one J2EE design and ...

  3. spring之IOC和DI关系

    spring之IOC和DI关系 IOC:控制反转:那么什么是控制反转呢? 对于程序开发人员来说,在没有使用spring之前,我们如果需要某一个对象,那么我们会直接去new这个对象,在程序员的世界里还有 ...

  4. 请简述什么是spring的ioc和di_请简述什么是 Spring 的 IoC 和 DI?_学小易找答案

    [连线题]把微生物和适用的生物反应器连线 [判断题]混凝土保护层是指从混凝土表面到箍筋公称直径外边缘之间的最小距离. [多选题]下列哪些问题是我们人类目前面临的严峻生态环境问题? [单选题]这是什么器 ...

  5. Spring的IOC与DI的个人杂谈

    Spring的IOC与DI的个人杂谈 一.前言 初学者初学Spring框架的时候,往往是伴随着SSM三大框架的学习而了解的.但是这样是不好的,我们应该在任务之余去学习一些本框架一些核心的知识点. 本篇 ...

  6. 互相引用 spring_巧夺天工,这样理解Spring的IOC、DI下来,真的很清晰了

    前言 你可能会有如下问题: 想看Spring源码,但是不知道应当如何入手去看,对整个Bean的流程没有概念,碰到相关问题也没有头绪如何下手 看过几遍源码,没办法彻底理解,没什么感觉,没过一阵子又忘了本 ...

  7. 关于Spring的IOC和DI

    原始调用模型 Spring的演化过程 Spring的调用过程 ======================================= IoC[理解][应用][重点] 1.IoC(Inversi ...

  8. Spring框架——IOC、DI

    本篇博客主要介绍Java中的IOC和DI,以及在String框架中的应用.首先,我们将对IOC和DI进行概念介绍,然后讲解它们的关系及在String框架中的应用,最后通过一个实例来展示它们的具体用法. ...

  9. Java开发为何深入人心 ?我来带你解开 Spring、IoC、DI 的秘密~

    目录 一.什么是Spring? 1.1.什么是容器? 1.2.IoC是什么? 1.3.IoC带来了什么好处? 二.什么是DI? 2.1.IoC和DI有什么关系? 一.什么是Spring? 一句概括,S ...

  10. Spring的IOC和DI(带例子,超级详解)

    1.什么是IOC?(Inversion Of Controll 控制反转) 控制反转是面向对象编程中的一种设计原则,可以用来降低计算机代码之间的耦合度,其中最常见的方式是依赖注入,还有一种方式是依赖查 ...

最新文章

  1. IOS开发CALayer隐式动画
  2. 饿了么交易系统应用架构演进
  3. 女生学计算机有什么要求,女生学计算机专业好吗?
  4. 世界读书日 阿里人是这样看书的?
  5. IDEA中安装Free Mybatis plugin插件实现从dao层到mapper层自由跳转
  6. Apache ECharts各种图表页面展示
  7. 客户端支持的cookie
  8. 21天实战人工智能系列:人工智能产品经理最佳实践(1)
  9. mysql 免安装版迁移_mysql免安装版 安装配置 (转)
  10. Oracle注册表修改 乱码编码
  11. 深度学习笔记(3) 向量化逻辑回归
  12. 配置多个git账号_一台电脑,两个及多个git账号配置
  13. ThinkPHP 使用极光推送给ios推送消息
  14. Sublime 常用操作
  15. ngrok转发mysql连接_使用小米球 -Ngrok 实现内网转发
  16. 设计模式学习笔记-装饰模式
  17. c语言禁忌搜索算法源代码,禁忌搜索算法CC++源代码.pdf
  18. 《Java从入门到放弃》系列文章改版中...
  19. 手把手教你搭建STM32MP1开发环境
  20. 每日英语(2021-2-27)

热门文章

  1. 【Kafka】kafka 获取消费组 详情 Exiting due to KeeperErrorCode = NoNode for /consumers/group
  2. 人大计算机跨考,2018考研心得:计算机专业跨考人大经济学全攻略.doc
  3. RateLimiter配合ConcurrentHashMap对用户进行简单限流
  4. Navicat Premium 12卸载注册表 激活码 彻底删除
  5. 笨方法学Python—ex43:基本的面向对象分析和设计
  6. virtualBox新建虚拟电脑
  7. AI大语音(十)——N-gram语言模型(深度解析)
  8. 微信小程序-仿今日头条客户端
  9. java实现本地图片转urljava中映射本地图片地址为url访问
  10. 字符串匹配 KMP算法 C++