JavaEE常见⾯试题之AOP,IOC的理解
1.IOC控制反转
1.1、IoC是什么
Ioc—Inversion of Control,即“控制反转”,不是什么技术,⽽是⼀种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,⽽不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些⽅⾯反转了”,那我们来深⼊分析⼀下:
●谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进⾏创建对象,是程序主动去创建依赖对象;⽽IoC是有专门⼀个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括⽐如⽂件等)。
●为何是反转,哪些⽅⾯反转了:有反转就有正转,传统应⽤程序是由我们⾃⼰在对象中主动控制去直接获取依赖对象,也就是正转;⽽反转则是由容器来帮忙创建及注⼊依赖对象;为何是反转?因为由容器帮我们查及注⼊依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些⽅⾯反转了?依赖对象的获取被反转了。
1.2、IoC能做什么
IoC 不是⼀种技术,只是⼀种思想,⼀个重要的⾯向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应⽤程序都是由我们在类内部主动创建依赖对象,从⽽导致类与类之间⾼耦合,难于测试;有了IoC容器后,把创建和查依赖对象的控制权交给了容器,由容器进⾏注⼊组合对象,所以对象与对象之间是 松散耦合,这样也⽅便测试,利于功能复⽤,更重要的是使得程序的整个体系结构变得⾮常灵活。
其实IoC对编程带来的最⼤改变不是从代码上,⽽是从思想上,发⽣了“主从换位”的变化。应⽤程序原本是⽼⼤,要获取什么资源都是主动出击,但是在IoC/DI思想中,应⽤程序就变成被动的了,被动的等待IoC容器来创建并注⼊它所需要的资源了。
IoC很好的体现了⾯向对象设计法则之⼀—— 好莱坞法则:“别我们,我们你”;即由IoC容器帮对象相应的依赖对象并注⼊,⽽不是由对象主动去。
1.3、IoC和DI
DI—Dependency Injection,即“依赖注⼊”:组件之间依赖关系由容器在运⾏期决定,形象的说,即由容器动态的将某个依赖关系注⼊到组件之中。依赖注⼊的⽬的并⾮为软件系统带来更多功能,⽽是为
了提升组件重⽤的频率,并为系统搭建⼀个灵活、可扩展的平台。通过依赖注⼊机制,我们只需要通过简单的配置,⽽⽆需任何代码就可指定⽬标需要的资源,完成⾃⾝的业务逻辑,⽽不需要关⼼具体的资源来⾃何处,由谁实现。
理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注⼊谁,注⼊了什么”,那我们来深⼊分析⼀下:
●谁依赖于谁:当然是应⽤程序依赖于IoC容器;
●为什么需要依赖:应⽤程序需要IoC容器来提供对象需要的外部资源;
●谁注⼊谁:很明显是IoC容器注⼊应⽤程序某个对象,应⽤程序依赖的对象;
●注⼊了什么:就是注⼊某个对象所需要的外部资源(包括对象、资源、常量数据)。
IoC和DI由什么关系呢?其实它们是同⼀个概念的不同⾓度描述,由于控制反转概念⽐较含糊(可能只是理解为容器控制对象这⼀个层⾯,很难让⼈想到谁来维护对象关系),所以2004年⼤师级⼈物Martin Fowler⼜给出了⼀个新的名字:“依赖注⼊”,相对IoC ⽽
⾔,“依赖注⼊”明确描述了“被注⼊对象依赖IoC容器配置依赖对象”。
2.AOP⾯向切⾯编程
2.1、AOP是什么
AOP(Aspect Oriented Programming),即⾯向切⾯编程,可以说是OOP(Object Oriented Programming,⾯向对象编程)的补充和完善。OOP引⼊封装、继承、多态等概念来建⽴⼀种对象层次结构,⽤于模拟公共⾏为的⼀个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如⽇志功能。⽇志代码往往横向地散布在所有对象层次中,⽽与它对应的对象的核⼼功能毫⽆关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的⽆关的代码被称为横切(cross cutting),在OOP设计中,它导致了⼤量代码的重复,⽽不利于各个模块的重⽤。
AOP技术恰恰相反,它利⽤⼀种称为”横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共⾏为封装到⼀个可重⽤模块,并将其命名为”Aspect”,即切⾯。所谓”切⾯”,简单说就是那些与业务⽆关,却为业务模块所共同调⽤的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
使⽤”横切”技术,AOP把软件系统分为两个部分:核⼼关注点和横切关注点。业务处理的主要流程是核⼼关注点,与之关系不⼤的部分是横切关注点。横切关注点的⼀个特点是,他们经常发⽣在核⼼关注点的多处,⽽各处基本相似,⽐如权限认证、⽇志、事物。AOP的作⽤在于分离系统中的各种关注点,将核⼼关注点和横切关注点分离开来。
java面向对象的特征有哪些方面AOP核⼼概念
1、横切关注点
对哪些⽅法进⾏拦截,拦截后怎么处理,这些关注点称之为横切关注点
2、切⾯(aspect)
类是对物体特征的抽象,切⾯就是对横切关注点的抽象
3、连接点(joinpoint)
被拦截到的点,因为Spring只⽀持⽅法类型的连接点,所以在Spring中连接点指的就是被拦截到的⽅法,实际上连接点还可以是字段或者构造器
4、切⼊点(pointcut)
对连接点进⾏拦截的定义
5、通知(advice)
所谓通知指的就是指拦截到连接点之后要执⾏的代码,通知分为前置、后置、异常、最终、环绕通知五类
6、⽬标对象
代理的⽬标对象
7、织⼊(weave)
将切⾯应⽤到⽬标对象并导致代理对象创建的过程
8、引⼊(introduction)
在不修改代码的前提下,引⼊可以在运⾏期为类动态地添加⼀些⽅法或字段
2.2、Spring对AOP的⽀持
Spring中AOP代理由Spring的IOC容器负责⽣成、管理,其依赖关系也由IOC容器负责管理。因此,AOP代理可以直接使⽤容器中的其它bean实例作为⽬标,这种关系可由IOC容器的依赖注⼊提供。Spring创建代理的规则为:
1、默认使⽤Java动态代理来创建AOP代理,这样就可以为任何接⼝实例创建代理了
2、当需要代理的类不是代理接⼝的时候,Spring会切换为使⽤CGLIB代理,也可强制使⽤CGLIB
AOP编程其实是很简单的事情,纵观AOP编程,程序员只需要参与三个部分:
1、定义普通业务组件
2、定义切⼊点,⼀个切⼊点可能横切多个业务组件
3、定义增强处理,增强处理就是在AOP框架为普通业务组件织⼊的处理动作
所以进⾏AOP编程的关键就是定义切⼊点和定义增强处理,⼀旦定义了合适的切⼊点和增强处理,AOP框架将⾃动⽣成AOP代理,即:代理对象的⽅法=增强处理+被代理对象的⽅法。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论