Spring框架IOC和AOP的实现原理与详解
IoC(Inversion of Control)
(1). IoC(Inversion of Control)是指容器控制程序对象之间的关系,⽽不是传统实现中,由程序代码直接操控。控制权由应⽤代码中转到了外部容器,控制权的转移是所谓反转。对于Spring⽽⾔,就是由Spring来控制对象的⽣命周期和对象之间的关系;IoC还有另外⼀个名字——“依赖注⼊(Dependency Injection)”。从名字上理解,所谓依赖注⼊,即组件之间的依赖关系由容器在运⾏期决定,即由容器动态地将某种依赖关系注⼊到组件之中。
(2). 在Spring的⼯作⽅式中,所有的类都会在spring容器中登记,告诉spring这是个什么东西,你需要什么东西,然后spring会在系统运⾏到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象⽣存周期的不再是引⽤它的对象,⽽是spring。对于某个具体的对象⽽⾔,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。
(3). 在系统运⾏中,动态的向某个对象提供它所需要的其他对象。
(4). 依赖注⼊的思想是通过反射机制实现的,在实例化⼀个类时,它通过反射调⽤类中set⽅法将事先保
存在HashMap中的类属性注⼊到类中。总⽽⾔之,在传统的对象创建⽅式中,通常由调⽤者来创建被调⽤者的实例,⽽在Spring中创建被调⽤者的⼯作由Spring来完成,然后注⼊调⽤者,即所谓的依赖注⼊or控制反转。注⼊⽅式有两种:依赖注⼊和设置注⼊; IoC的优点:降低了组件之间的耦合,降低了业务对象之间替换的复杂性,使之能够灵活的管理对象。
AOP(Aspect Oriented Programming)
(1). AOP⾯向⽅⾯编程基于IoC,是对OOP的有益补充;
(2). AOP利⽤⼀种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共⾏为封装到⼀个可重⽤模块,并将其名
为“Aspect”,即⽅⾯。所谓“⽅⾯”,简单地说,就是将那些与业务⽆关,却为业务模块所共同调⽤的逻辑或责任封装起来,⽐如⽇志记录,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
(3). AOP代表的是⼀个横向的关系,将“对象”⽐作⼀个空⼼的圆柱体,其中封装的是对象的属性和⾏为;则⾯向⽅⾯编程的⽅法,就是将这个圆柱体以切⾯形式剖开,选择性的提供业务逻辑。⽽剖开的切⾯,也就是所谓的“⽅⾯”了。然后它⼜以巧夺天功的妙⼿将这些剖开的切⾯复原,不留痕迹,但完成了效果。
(4). 实现AOP的技术,主要分为两⼤类:⼀是采⽤动态代理技术,利⽤截取消息的⽅式,对该消息进⾏装饰,以取代原有对象⾏为的执⾏;⼆是采⽤静态织⼊的⽅式,引⼊特定的语法创建“⽅⾯”,从⽽使得编译器可以在编译期间织⼊有关“⽅⾯”的代码。
(5). Spring实现AOP:JDK动态代理和CGLIB代理 JDK动态代理:其代理对象必须是某个接⼝的实现,它是通过在运⾏期间创建⼀个接⼝的实现类来完成对⽬标对象的代理;其核⼼的两个类是InvocationHandler和Proxy。 CGLIB代理:实现原理类似于JDK动态代理,只是它在运⾏期间⽣成的代理对象是针对⽬标类扩展的⼦类。CGLIB是⾼效的代码⽣成包,底层是依靠ASM(开源的java字节码编辑类库)操作字节码实现的,性能⽐JDK强;需要引⼊包asm.jar和cglib.jar。使⽤AspectJ注⼊式切⾯和@AspectJ注解驱动的切⾯实际上底层也是通过动态代理实现的。
(6). AOP使⽤场景:
Authentication 权限检查
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 延迟加载
Debugging 调试
logging, tracing, profiling and monitoring ⽇志记录,跟踪,优化,校准
Performance optimization 性能优化,效率检查
Persistence 持久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务管理
另外Filter的实现和struts2的的实现都是AOP思想的体现。
我们是在使⽤Spring框架的过程中,其实就是为了使⽤IOC,依赖注⼊,和AOP,⾯向切⾯编程,这两个是Spring的灵魂。
主要⽤到的设计模式有⼯⼚模式和代理模式。
IOC就是典型的⼯⼚模式,通过sessionfactory去注⼊实例。
AOP就是典型的代理模式的体现。
代理模式是常⽤的java设计模式,他的特征是代理类与委托类有同样的接⼝,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,⼀个代理类的对象与⼀个委托类的对象关联,代理类的对象本⾝并不真正实现服务,⽽是通过调⽤委托类的对象的相关⽅法,来提供特定的服务。
spring的IoC容器是spring的核⼼,spring AOP是spring框架的重要组成部分。
在传统的程序设计中,当调⽤者需要被调⽤者的协助时,通常由调⽤者来创建被调⽤者的实例。但在spring⾥创建被调⽤者的⼯作不再由调⽤者来完成,因此控制反转(IoC);创建被调⽤者实例的⼯作通常由spring容器来完成,然后注⼊调⽤者,因此也被称为依赖注⼊(DI),依赖注⼊和控制反转是同⼀个概念。
⾯向⽅⾯编程(AOP)是以另⼀个⾓度来考虑程序结构,通过分析程序结构的关注点来完善⾯向对象编程(OOP)。OOP将应⽤程序分解成各个层次的对象,⽽AOP将程序分解成多个切⾯。spring AOP 只实现了⽅法级别的连接点,在J2EE应⽤中,AOP拦截到⽅法级别的操作就已经⾜够。在spring中,
未来使IoC⽅便地使⽤健壮、灵活的企业服务,需要利⽤spring AOP实现为IoC和企业服务之间建⽴联系。
IOC:控制反转也叫依赖注⼊。利⽤了⼯⼚模式
将对象交给容器管理,你只需要在spring配置⽂件总配置相应的bean,以及设置相关的属性,让spring容器来⽣成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置⽂件中配置的bean都初始化好,然后在你需要调⽤的时候,就把它已经初始化好的那些bean分配给你需要调⽤这些bean的类(假设这个类名是A),分配的⽅法就是调⽤A的setter⽅法来注⼊,⽽不需要你在A⾥⾯new这些bean 了。
注意:⾯试的时候,如果有条件,画图,这样更加显得你懂了.
spring ioc注解AOP:⾯向切⾯编程。(Aspect-Oriented Programming)
AOP可以说是对OOP的补充和完善。OOP引⼊封装、继承和多态性等概念来建⽴⼀种对象层次结构,⽤以模拟公共⾏为的⼀个集合。当我们需要为分散的对象引⼊公共⾏为的时候,OOP则显得⽆能为⼒。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如⽇志功能。⽇志代码往往⽔平地散布在所有对象层次中,⽽与它所散布到的对象的核⼼功能毫⽆关系。在OOP设计中,它导致了⼤量代码的重复,⽽不利于各个模块的重⽤。
将程序中的交叉业务逻辑(⽐如安全,⽇志,事务等),封装成⼀个切⾯,然后注⼊到⽬标对象(具体业务逻辑)中去。
实现AOP的技术,主要分为两⼤类:⼀是采⽤动态代理技术,利⽤截取消息的⽅式,对该消息进⾏装饰,以取代原有对象⾏为的执⾏;⼆是采⽤静态织⼊的⽅式,引⼊特定的语法创建“⽅⾯”,从⽽使得编译器可以在编译期间织⼊有关“⽅⾯”的代码.
简单点解释,⽐⽅说你想在你的biz层所有类中都加上⼀个打印‘你好’的功能,这时就可以⽤aop思想来做.你先写个类写个类⽅法,⽅法经实现打印‘你好’,然后Ioc这个类 ref=“biz.*”让每个类都注⼊即可实现。
spring 的优点?
1.降低了组件之间的耦合性,实现了软件各层之间的解耦
2.可以使⽤容易提供的众多服务,如事务管理,消息服务等
3.容器提供单例模式⽀持
4.容器提供了AOP技术,利⽤它很容易实现如权限拦截,运⾏期监控等功能
5.容器提供了众多的辅助类,能加快应⽤的开发
6.spring对于主流的应⽤框架提供了集成⽀持,如hibernate,JPA,Struts等
7.spring属于低侵⼊式设计,代码的污染极低
8.独⽴于各种应⽤服务器
9.spring的DI机制降低了业务对象替换的复杂性
10.Spring的⾼度开放性,并不强制应⽤完全依赖于Spring,开发者可以⾃由选择spring的部分或全部
什么是DI机制?
依赖注⼊(Dependecy Injection)和控制反转(Inversion of Control)是同⼀个概念,具体的讲:当某个⾓⾊
需要另外⼀个⾓⾊协助的时候,在传统的程序设计过程中,通常由调⽤者来创建被调⽤者的实例。但在spring中
创建被调⽤者的⼯作不再由调⽤者来完成,因此称为控制反转。创建被调⽤者的⼯作由spring来完成,
然后注⼊调⽤者
因此也称为依赖注⼊。
spring以动态灵活的⽅式来管理对象,注⼊的两种⽅式,设置注⼊和构造注⼊。
设置注⼊的优点:直观,⾃然
构造注⼊的优点:可以在构造器中决定依赖关系的顺序。
什么是AOP?
⾯向切⾯编程(AOP)完善spring的依赖注⼊(DI),⾯向切⾯编程在spring中主要表现为两个⽅⾯
1.⾯向切⾯编程提供声明式事务管理
2.spring⽀持⽤户⾃定义的切⾯
⾯向切⾯编程(aop)是对⾯向对象编程(oop)的补充,
⾯向对象编程将程序分解成各个层次的对象,⾯向切⾯编程将程序运⾏过程分解成各个切⾯。
AOP从程序运⾏⾓度考虑程序的结构,提取业务处理过程的切⾯,oop是静态的抽象,aop是动态的抽象,
是对应⽤执⾏过程中的步骤进⾏抽象,,从⽽获得步骤之间的逻辑划分。
aop框架具有的两个特征:
1.各个步骤之间的良好隔离性
2.源代码⽆关性
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论