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类再编译目标类。

Spring的IoC与AOP的理解的更多相关文章

  1. Spring 的 IOC 和 AOP 的理解

    Spring 的 IOC 和 AOP 的理解: https://www.jianshu.com/p/bf1adc3b75e6 对Spring的核心(AOP和IOC)的理解(大白话) https://w ...

  2. 对spring中IOC和AOP的理解

    IOC:控制反转也叫依赖注入.利用了工厂模式. 为了方便理解,分解成每条以便记忆.  1.将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器 ...

  3. Spring中IOC和AOP的理解

    IOC和AOP是Spring的核心 IOC:控制反转:将创建对象以及维护对象之间的关系由代码交给了spring容器进行管理,也就是创建对象的方式反转了,交由spring容器进行管理. DI:依赖注入: ...

  4. Spring面试 IOC和AOP的理解

    spring 的优点?1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实 ...

  5. 简单理解Spring之IOC和AOP及代码示例

    Spring是一个开源框架,主要实现两件事,IOC(控制反转)和AOP(面向切面编程). IOC 控制反转,也可以称为依赖倒置. 所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B, ...

  6. Spring的IOC和AOP之深剖

    今天,既然讲到了Spring 的IOC和AOP,我们就必须要知道 Spring主要是两件事: 1.开发Bean:2.配置Bean.对于Spring框架来说,它要做的,就是根据配置文件来创建bean实例 ...

  7. Spring 的IOC和AOP总结

    Spring 的IOC和AOP IOC 1.IOC 许多应用都是通过彼此间的相互合作来实现业务逻辑的,如类A要调用类B的方法,以前我们都是在类A中,通过自身new一个类B,然后在调用类B的方法,现在我 ...

  8. Spring中IOC和AOP的详细解释(转)

    原文链接:Spring中IOC和AOP的详细解释 我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂 ...

  9. Spring 的IOC 和Aop

    Spring 的IOC 和Aop

随机推荐

  1. Http协议之Content-Length

    前言 http协议是互联网中最重要的协议之一,虽然看上去很简单,但是实际中经常遇到问题,我们就已经遇到好几次了.有长连接相关的,有报文解析相关的.对http协议不能一知半解,必须透彻理解才行.所以就写 ...

  2. Ubuntu 10.10, 11.04, 11.10这三个版本无法从优盘启动

    问题:Ubuntu 10.10, 11.04, 11.10这三个版本无法从优盘启动 解决:从U盘启动安装的时候,会卡住不动.搞定办法相当简单,修改syslinux/syslinuxfg文件:将defa ...

  3. linux和Android的Makefile和android.mk

    1. makefile 1.1 gcc的参数 -Wall: 是打开警告开关, -O:    代表默认优化,可选:-O0不优化,-O1低级优化,-O2中级优化,-O3高级优化,-Os代码空间优化. -g ...

  4. select2插件改造之设置自定义选项 源码

    改造特性: 适应业务需要,选项里面包含“其他”其它”,可以点击填写并设置自定义选项 效果图: 具体代码不做阐述,如有类似需求,请私信.主要源码: /* Copyright 2012 Igor Vayn ...

  5. iOS开源项目周报0316

    由OpenDigg 出品的iOS开源项目周报第十二期来啦.我们的iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等.GodEye  ...

  6. 可变参数的lambda表达式

    delegate int mydelegate(params int[] a); class Program { static void Main(string[] args) { //接收可变参数的 ...

  7. Knockout.js CSS绑定

    <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...

  8. jdk锁相关

    锁类型 可重入锁:在执行对象中所有同步方法不用再次获得锁 可中断锁:在等待获取锁过程中可中断 公平锁: 按等待获取锁的线程的等待时间进行获取,等待时间长的具有优先获取锁权利 读写锁:对资源读取和写入的 ...

  9. 中小型研发团队架构实践三:微服务架构(MSA)

    一.MSA 简介 1.1.MSA 是什么 微服务架构 MSA 是 Microservice Architect 的简称,它是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相通讯.互相 ...

  10. plSql读取Oracle数据库中文乱码

    新建环境变量,设置变量名:NLS_LANG,变量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK,确定即可