Spring中,关于IOC和AOP的那些事

1、spring 的优势?


1.下降了组件之间的耦合性 ,实现了软件各层之间的解耦 
2.可使用容易提供的众多服务,如事务管理,消息服务等 
3.容器提供单例模式支持 
4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 
5.容器提供了众多的辅助类,能加快应用的开发 
6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等 
7.spring属于低侵入式设计,代码的污染极低 
8.独立于各类应用服务器 
9.spring的DI机制下降了业务对象替换的复杂性 
10.Spring的高度开放性,并不强制应用彻底依赖于Spring,开发者能够自由选择spring的部分或所有 java


2、什么是IOC(DI)? 


IOC,即控制反转(Inversion of Control),他与依赖注入(Dependecy Injection)是同一个概念。具体的讲:当某个角色须要另一个角色协助的时候,在传统的程序设计过程当中,一般由调用者来建立被调用者的实例。但在spring中 建立被调用者的工做再也不由调用者来完成,所以称为控制反转。建立被调用者的工做由spring来完成,而后注入调用者所以也称为依赖注入。 spring

它并非一种技术实现,而是一种设计思想。在任何一个有实际开发意义的程序项目中,咱们会使用不少类来描述它们特有的功能,而且经过类与类之间的相互协做来完成特定的业务逻辑。这个时候,每一个类都须要负责管理与本身有交互的类的引用和依赖,代码将会变的异常难以维护和极度的高耦合。而IOC的出现正是用来解决这个问题,咱们经过IOC将这些相互依赖对象的建立、协调工做交给Spring容器去处理,每一个对象只须要关注其自身的业务逻辑关系就能够了。在这样的角度上来看,得到依赖的对象的方式,进行了反转,变成了由spring容器控制对象如何获取外部资源(包括其余对象和文件资料等等)。数据库

举例:某一天,你生病了,可是你不清楚本身到底得了什么病,你只知道本身头疼,咳嗽,全身无力。这个时候你决定去药店买药,药店有不少种药,仅仅是治疗头疼就有好几十种,还有西药中药等区别。而后你本身看了看说明书,选择了一盒你本身以为最能治疗本身病症的药,付钱吃药,期待能够早点好起来。 
可是这个过程,对于一个病人来讲,太辛苦了。头疼,咳嗽,全身无力,还要一个个的看药品说明书,一个个的比较哪一个药比较好,简直是太累了。这个时候,你决定直接去医院看医生。 
医生给你作了检查,知道你的病症是什么,有什么缘由引发的;同时医生很是了解有哪些药能治疗你的病痛,而且能根据你的自身状况进行筛选。只须要短短的十几分钟,你就能拿到对症下药的药品,即省时又省力。编程

在上面这个例子中,IOC起到的就是医生的做用,它收集你的需求要求,而且对症下药,直接把药开给你。你就是对象,药品就是你所须要的外部资源。经过医生,你不用再去找药品,而是经过医生把药品开给你。这就是整个IOC的精髓所在。安全

Spring以动态灵活的方式来管理对象 , 注入的两种方式,设置注入和构造注入。 
设置注入的优势:直观,天然 
构造注入的优势:能够在构造器中决定依赖关系的顺序。 服务器


3、什么是AOP? 

Spring中的IOC与AOP详解PPT

AOP:面向切面编程,每每被定义为促使软件系统实现关注点的分离的技术。系统是由许多不一样的组件所组成的,每个组件各负责一块特定功能。除了实现自身核心功能以外,这些组件还常常承担着额外的职责。例如日志、事务管理和安全这样的核心服务常常融入到自身具备核心业务逻辑的组件中去。这些系统服务常常被称为横切关注点,由于它们会跨越系统的多个组件。app

AOP的概念不像IOC同样实例化举例,如今咱们以一个系统中的具体实现来说讲AOP具体是个什么技术。框架

咱们以系统中经常使用到的事务管控举例子。在系统操做数据库的过程当中,不可避免地要考虑到事务相关的内容。若是在每个方法中都新建一个事务管理器,那么无疑是对代码严重的耦合和侵入。为了简化咱们的开发过程(实际上spring所作的一切实现都是为了简化开发过程),须要把事务相关的代码抽成出来作为一个独立的模块。经过AOP,确认每个操做数据库方法为一个链接点,这些链接点组成了一个切面。当程序运行到其中某个一个切点时,咱们将事务管理模块顺势织入对象中,经过通知功能,完成整个事务管控的实现。这样一来,全部的操做数据库的方法中不须要再单独关心事务管理的内容,只须要关注自身的业务代码的实现便可。全部的事务管控相关的内容都经过AOP的方式进行了实现。简化了代码的内容,将目标对象复杂的内容进行解耦,分离业务逻辑与横切关注点。oop

下面介绍一下AOP相关的术语:spa

一、通知: 通知定义了切面是什么以及什么时候使用的概念。Spring 切面能够应用5种类型的通知:

  • 前置通知(Before):在目标方法被调用以前调用通知功能。
  • 后置通知(After):在目标方法完成以后调用通知,此时不会关心方法的输出是什么。
  • 返回通知(After-returning):在目标方法成功执行以后调用通知。
  • 异常通知(After-throwing):在目标方法抛出异常后调用通知。
  • 环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用以前和调用以后执行自定义的行为。

二、链接点:是在应用执行过程当中可以插入切面的一个点。

三、切点: 切点定义了切面在何处要织入的一个或者多个链接点。
四、切面:是通知和切点的结合。通知和切点共同定义了切面的所有内容。
五、引入:引入容许咱们向现有类添加新方法或属性。
六、织入:是把切面应用到目标对象,并建立新的代理对象的过程。切面在指定的链接点被织入到目标对象中。在目标对象的生命周期中有多个点能够进行织入: 

  • 编译期: 在目标类编译时,切面被织入。这种方式须要特殊的编译器。AspectJ的织入编译器就是以这种方式织入切面的。
  • 类加载期:切面在目标加载到JVM时被织入。这种方式须要特殊的类加载器(class loader)它能够在目标类被引入应用以前加强该目标类的字节码。
  • 运行期: 切面在应用运行到某个时刻时被织入。通常状况下,在织入切面时,AOP容器会为目标对象动态地建立一个代理对象。SpringAOP就是以这种方式织入切面的。

面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring中主要表现为两个方面: 

  1. 面向切面编程提供声明式事务管理 
  2. spring支持用户自定义的切面 

面向切面编程(aop)是对面向对象编程(oop)的补充, 面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。 
AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象, 是对应用执行过程当中的步骤进行抽象,,从而得到步骤之间的逻辑划分。 
AOP框架具备的两个特征: 

  1. 各个步骤之间的良好隔离性 
  2. 源代码无关性 

 

4、总结:

IOC:控制反转也叫依赖注入,IOC利用java反射机制,AOP利用代理模式。所谓控制反转是指,原本被调用者的实例是有调用者来建立的,这样的缺点是耦合性太强,IOC则是统一交给spring来管理建立,将对象交给容器管理,你只须要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,而后在你须要调用的时候,就把它已经初始化好的那些bean分配给你须要调用这些bean的类。
AOP:面向切面编程。(Aspect-Oriented Programming)
AOP能够说是对OOP的补充和完善。OOP引入封装、继承和多态性等概念来创建一种对象层次结构,用以模拟公共行为的一个集合。实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法建立“方面”,从而使得编译器能够在编译期间织入有关“方面”的代码,属于静态代理。

若是还不明白,放弃java吧!

相关文章
相关标签/搜索