如何理解Spring的IoC与Aop?

1.Spring它到底是什么?

Spring是一个开源的Java应用程序开发框架,为了解决企业应用开发的复杂性而创建的。

  在spring中,它会认为一切Java类都是资源,而资源就是Bean,容纳这些Bean是Spring所提供的IoC(Inversion of Control)容器。Spring框架除了帮我们管理对象及其依赖关系(IoC),还提供像通用日志记录、性能统计、安全控制、异常处理等面向切面的能力(AOP),还能帮我管理最头疼的数据库事务,提供与第三方数据访问框架集成(如Hibernate、JPA),与各种Java EE技术整合(如Java Mail、任务调度等等),提供一套自己的web层框架Spring MVC、而且还能非常简单的与第三方web框架集成。

2.IoC它是一种思想


  IoC—Inversion of Control,即“控制反转”,是一种设计思想。这样的思想是源自于生活的,其核心就是资源不由使用资源的双方管理,而由不使用资源的第三方管理。例如,我们每天使用的支付宝、微信支付等支付体系就可以说是一个庞大的IoC容器。
  DI(依赖注入)其实就是对IoC设计思想的具体实现。IoC主要的实现方式有两种:依赖查找,依赖注入。依赖注入是一种更可取的方式。

  回到Java中,IoC意味着将开发者编写的Java对象交给IoC容器控制,要理解IoC,就要抓住关键词"Control"。

作为开发者我们控制什么?

  • 传统设计,我们需要访问对象的成员或使用对象中的方法时,我们需要在程序中通过new进行创建对象,是程序主动的去创建依赖对象。

IoC控制了什么?

  • IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;是IoC 容器控制了对象即被动创建了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。

  反转就好理解了,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,就是正转;而反转则是由容器来帮忙创建及注入依赖对象。对象的控制权反转了。这就是一种控制反转的理念,它最大的好处在于降低对象之间的耦合。
IoC实际上是软件设计中依赖倒置原则的体现,有兴趣可以参考这篇文章

3.面向切片编程AOP


  AOP其实就是一种解耦的思想,并不神秘,其目的就是将项目业务逻辑代码与一些业务无关琐碎的事务代码分离开来。让开发者只关心业务逻辑部分,不用关系类似于数据库事务管理、日志管理等琐碎的事务。

  SpringAOP建立在Java的反射基础之上,将分布在程序中的公共部分提取出来,做成了切面类(比如数据库事务)这样做的好处在于代码的可重用。一旦涉及到该功能的需求发生变化,只要修改该代码就行。
从生活中可以很容易举出例子,比如一个开发者A想把大象塞进冰箱,那么他就要:

  • 打开冰箱
  • 塞进大象
  • 关掉冰箱

  如果此时有开发者B想塞阿猫,开发者C想塞阿狗,那么他们都需要做的公共部分就是打开冰箱和关掉冰箱。那么现在要求,每次打开冰箱的时候都需要在日志上写上打开冰箱时间,这个时候就发现每个开发者都要加一个写上时间的步骤。在企业开发中,如果有成百上千个开发者,那么维护成本就会很高。
SpringAOP是怎么做的呢?
  Spring把打开冰箱和关掉冰箱这两个动作提取出来做成一个切面类,找到切点(切点就是塞这个动作),然后织入(织入就是生成代理对象的过程)。下次开发者A去想要塞大象的时,Spring就会把冰箱打开好,开发者A塞进大象,Spring再来把冰箱关闭。开发者A现在只需要关注自己要干什么,而不必关心打开冰箱和关掉冰箱了。如果要求在每个开发者打开冰箱前在日志上写下打开时间,那么也只需要改一下切面类中的代码。
  打开冰箱和关掉冰箱就相当于企业项目中的数据库事务,而塞大象就相当于业务逻辑代码。

AOP的实现


  AOP有多种实现,最常使用的就是Spring AOP和AspectJ,Spring只是使用了与AspectJ5一样的注解,但仍然没有使用AspectJ的编译器,底层是动态代理技术的实现,并不依赖于AspectJ的编译器。
  织入就是一个生成代理对象的过程,一般分为动态织入和静态织入,动态织入的方式是在运行时动态将要增强的代码织入到目标类中,这样往往是通过动态代理技术完成的,静态织入是指在编译时期就织入,即:编译出来的class文件,字节码就已经被织入了。

SpringAOP是采用动态织入

有两种实现方式

  • 基于接口的动态代理(Dynamic Proxy)
  • 基于继承的CGLIB代理


    动态织入

AspectJ是采用静态织入

  使用AspectJ的acj编译器(类似javac)把aspect类编译成class字节码后,在java目标类编译时织入,即先编译aspect类再编译目标类。


静态织入
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • AOP实现可分为两类(按AOP框架修改源代码的时机): 静态AOP实现:AOP框架在编译阶段对程序进行修改,即实现...
    数独题阅读 2,300评论 0 22
  • TroyZhang阅读 981评论 0 2
  • 心中那一只青鸟——也来解读《青鸟书店》 ❤️《青鸟书店》是美国作家萨拉.吉奥的著作,她是《纽约时报》和《今日美国》...
    山西胡杨阅读 827评论 1 1
  • 姑娘 你伤的人心 何止他一个 可是你伤他的同时 最痛的也是你自己 他给她下了最后通牒 要么主动离婚 要么诉讼离婚 ...
    鱼小珂阅读 440评论 0 0