⾯试之Spring框架IOC和AOP的实现原理
本⽂讲的是⾯试之Spring框架IOC和AOP的实现原理, IoC(Inversion of Control) (1). IoC(Inversion of Control)是指容器控制程序对象之间的关系,⽽不是传统实现中,由程序代码直接操控。控制权由应⽤代码中转到了外部容器,控制权的转移是所。
spring ioc注解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思想的体现。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。