一、IOC理解

首先要分享的是Iteye的开涛这位技术牛人对Spring框架的IOC的理解,写得非常通俗易懂,以下内容全部来自原文,原文地址:http://jinnianshilongnian.iteye.com/blog/1413846
1、IoC是什么
Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们来深入分析一下:

●谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。

●为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。

用图例说明一下,传统程序设计如图下图,都是主动去创建相关对象然后再组合起来:

当有了IoC/DI的容器后,在客户端类中不再主动去创建这些对象了,如图所示:

2、 IoC能做什么
IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

其实IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了。

IoC很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。

3、 IoC和DI
DI—Dependency Injection,即“依赖注入”:是组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”,那我们来深入分析一下:

●谁依赖于谁:当然是应用程序依赖于IoC容器;

●为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;

●谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;

●注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。

IoC和DI由什么关系呢?其实它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IoC 而言,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。

我对IoC(控制反转)和DI(依赖注入)的理解

在平时的java应用开发中,在没有使用Spring的时候,每个对象在需要使用他的合作对象时,自己均要使用像new object() 这样的语法来将合作对象创建出来,主动权就在自己手上,自己需要哪个合作对象,就主动去创建,而这样就会使得对象间的耦合度高了,A的运转需要B,A要使用B,那么A就对B产生了依赖,也就是A和B之间存在一种耦合关系,并且是紧密耦合在一起,而使用了Spring之后就不一样了,创建合作对象B的工作是由Spring来做的,Spring创建好B对象,然后存储到一个容器里面,当A对象需要使用B对象时,Spring就从存放对象的那个容器里面取出A要使用的那个B对象,然后交给A对象使用,至于Spring是如何创建那个对象,以及什么时候创建好对象的,A对象不需要关心这些细节问题(你是什么时候生的,怎么生出来的我可不关心,能帮我干活就行),A得到Spring给我们的对象之后,两个人一起协作完成要完成的工作即可。
所以控制反转IoC(Inversion of Control)是说创建对象的控制权进行转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权力转移到第三方,比如转移交给了IoC容器,它就是一个专门用来创建对象的工厂,你要什么对象,它就给你什么对象,有了 IoC容器,依赖关系就变了,原先的依赖关系就没了,它们都依赖IoC容器了,通过IoC容器来建立它们之间的关系。

这是我对Spring的IoC(控制反转) 的理解。DI(依赖注入)其实就是IOC的另外一种说法,DI是由Martin Fowler 在2004年初的一篇论文中首次提出的。他总结:控制的什么被反转了?就是:获得依赖对象的方式反转了。

转载至https://blog.csdn.net/qq_43842093/article/details/121720682?ops_request_misc=&request_id=&biz_id=102&utm_term=springioc%E5%8E%9F%E7%90%86&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-121720682.142v50pc_rank_34_queryrelevant25,201v3control_1&spm=1018.2226.3001.4187

AOP简介

1、AOP的全称是Aspect-Oriented Programming,即面向切面编程(也称面向方面编程)。它是面向对象编程(OOP)的一种补充,目前已成为一种比较成熟的编程方式。
2、在传统的业务处理代码中,通常都会进行事务处理、日志记录等操作。虽然使用OOP可以通过组合或者继承的方式来达到代码的重用,但如果要实现某个功能(如日志记录),同样的代码仍然会分散到各个方法中。这样,如果想要关闭某个功能,或者对其进行修改,就必须要修改所有的相关方法。这不但增加了开发人员的工作量,而且提高了代码的出错率。
3、为了解决这一问题,AOP思想随之产生。AOP采取横向抽取机制,将分散在各个方法中的重复代码提取出来,然后在程序编译或运行时,再将这些提取出来的代码应用到需要执行的地方。这种采用横向抽取机制的方式,采用传统的OOP思想显然是无法办到的,因为OOP只能实现父子关系的纵向的重用。虽然AOP是一种新的编程思想,但却不是OOP的替代品,它只是OOP的延伸和补充。

spring中的loc和aop相关推荐

  1. spring中基于XML的AOP配置步骤

    spring中基于XML的AOP配置步骤 IAccountService.java package com.itheima.service;/*** 账户的业务层接口*/ public interfa ...

  2. Spring中的简单实现AOP小例子

    先说一下相应的知识作铺垫 Spring的AOP术语:          1)连接点(JointPoint):目标对象的每个方法     2)切入点(PontCut):切入了服务代码的连接点     3 ...

  3. Spring中的IOC和AOP是什么意思?

    (1) Spring是什么? IOC(控制反转)和AOP(面向方面编程)作为Spring框架的两个核心,很好地实现了解耦合.所以,简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AO ...

  4. Spring中的5种Aop常见应用方式(扫描注解方式)

    转载于:https://zhuanlan.zhihu.com/p/103236714 提到Aop,不得不提的那就是动态代理:关于动态代理,可以参考前面写过的文章 加耀:浅谈动态代理​zhuanlan. ...

  5. 谈谈Spring中的IOC和AOP概念 - 倪升武的博客 - CSDN博客

    转载于https://blog.csdn.net/eson_15/article/details/51090040 IOC和AOP是Spring中的两个核心的概念,下面谈谈对这两个概念的理解. 1. ...

  6. 关于Spring中IOC容器和AOP协同工作的原理理解

    1.在详细介绍 IOC 容器的工作原理前,这里先介绍一下实现 IOC 所用到的一些辅助类,包括BeanDefinition.BeanReference.PropertyValues.PropertyV ...

  7. spring中的IOC和AOP

    IOC IOC(Inversion Of Controll,控制反转)是一种设计思想,将原本在程序中手动创建对象的控制权,交由给Spring框架来管理.IOC容器是Spring用来实现IOC的载体,I ...

  8. springIllegalArgumentException Can not set field to $Proxy 在spring中使用事物或AOP遇到的错误

    一.问题出现 今天在ssm整合多模块的时候,当service注入到controller时,出现了service无法注入问题. 应用transaction注解方法的典型场景:接口+实现,在实现整个类上加 ...

  9. spring中使用动态代理(AOP)

    spring是整合了BGLIB和JDK两种动态代理 示例:使用CGLIB代理 public class MyCar {private String color = "blue";p ...

最新文章

  1. 了解女友的心还不如了解Python之在Python中解析和修改XML
  2. tensorboard使用_tensorboard查看训练曲线
  3. debian下运行netstat失败
  4. JDK时区与电脑系统时区不一致,导致时间new date不对
  5. Numpy 字符串处理
  6. android 绑定类名,Android Studio为Class跟Activity等添加注解
  7. HTML样式- CSS
  8. 罗技Lua脚本-CF神圣爆裂者自动开枪
  9. 64位java虚拟机_java虚拟机64位下载
  10. 乘风破浪,遇见未来新能源汽车(Electric Vehicle)之特斯拉提车必须知道的十个流程
  11. android 获取刘海高度,不同刘海屏幕获取安全高度
  12. 《灌篮高手》——一部看了n遍的动漫
  13. 威廉玛丽学院计算机专业好吗,威廉玛丽学院计算机硕士语言要求请问在哪
  14. Win10压缩卷提示磁盘空间不足
  15. 大数据相关资料论文小结
  16. Error response from daemon: removal of container XXX is already in progress
  17. 山东淀粉行业面临洗牌,深加工技术资金为王
  18. Linux内核之进程6: 深度睡眠
  19. 记录一下python爬虫手机app遇到的加密
  20. git基本命令使用大全

热门文章

  1. linux系统服务器忘记密码怎么办
  2. 技术支持和测试的区别_同步带线性模组 丝杆线性模组和直线电机模组的区别及应用...
  3. VScode:关于如何在鼠标右键选项栏中添加open with code
  4. mysql 2038年问题_64位Ubuntu系统的时间戳,2038年问题
  5. Git git config 配置使用
  6. Python分析【标题党】文章
  7. iOS 官方文档翻译
  8. 30岁的万维网活不长了! 蒂姆·伯纳斯·李要借去中心化亲手杀死它, 你再也不用担心......
  9. 煤炭行业管理平台解决方案,生产全过程价值管理,降本增效
  10. Elasticsearch使用说明(搬砖高人)