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. Android studio应用导入源码错误This attribute must be localized

    This attribute must be localized 产生原因: 多语言错误,源码中关于语言的显示不能直接赋值,而是需要通过xml来实现: 例如 <TextView android: ...

  2. 优化SQLServer

    由于SQLServer,数据文件mdf过大,造成系统异常卡 一. 更改隔离级别 ALTER DATABASE [B2EC] SET SINGLE_USER WITH ROLLBACK IMMEDIAT ...

  3. SpringFramework中重定向

    需求: 需要在两个@Controller之间跳转,实现重定向 解决: @PostMapping("/files/{path1}") public String upload(... ...

  4. 分析解决 spring quartz 中出现的执行两次问题

    1. 问题描述 在开发询盘功能时,遇到一个需求,就是后台定时任务执行用电施工业务的工单下发. 使用的技术是 spring quartz,因为其他应用有先例,配置quartz 完成后,先写了一个 hel ...

  5. HDU 2276 Kiki & Little Kiki 2 矩阵构造

    Kiki & Little Kiki 2 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java ...

  6. Mysql分布式部署高可用集群方案

    HAproxy+Mycat +MySQL主从集群高可用方案 1.         HAproxy高可用方案: haproxy+keepalived,利用keepalived的VIP浮动能力,(多台ha ...

  7. JS上传图片转化成Base64编码demo

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. 【转载】shell实例手册

    原文地址:shell实例手册  作者:没头脑的土豆 shell实例手册 0说明{ 手册制作: 雪松 更新日期: -- 欢迎系统运维加入Q群: 请使用"notepad++"打开此文档 ...

  9. 安装 Zsh 及 Oh-my-zsh

    详细介绍就略过吧,可以参考这篇文章:使用ZSH的九个理由 下面记录一下我在配置ZSH的过程中的要点: 1.基本上你能找到的配置教程都是基于oh-my-zsh的. 因为zsh配置过于复杂,所以有了oh- ...

  10. WinAPI: WinExec - 运行外部程序

    原文:http://www.cnblogs.com/del/archive/2008/02/13/1067871.html //声明 WinExec(   lpCmdLine: LPCSTR; {文件 ...