关于AOP的种种疑问

    最近在用AOP做一个小东西,于是开始翻阅一些AOP的资料,中间解决了自己的一些疑问,记录下来。

    

    什么是AOP?

    其实早就知道呵呵,这里作为引子吧。AOP是面向切面的编程。最大的好处就是对于已有的系统弱侵入。

现在用处比较多的就是数据库事务管理、日志处理、性能监控等等方面。因为这些东西足够公共,可以抽取出来,减少对于系统的侵入。

        

    AOP的主要原理是啥?

    动态代理,原有的类不做改变,构造出另外一个类来代理这个类的行为,在这个新类中添加逻辑。JDK在很早的版本就提供了动态代理功能,

目前还有比较出名的Cglib,这里就不再展开讨论。

    现在AOP有哪些实现?

    设计的目标是把横切的问题模块化,目前来看主要有四个实现。

    Aspect:语言级AOP的实现,扩展了Java语言,能够在编译期间提供模块代码的植入;

    AspectWerkz:基于java的简单、动态、轻量级的框架,支持运行期间和编译期间的植入;

    JBoss AOP:JBoss应用服务器框架扩展的一个功能;

    Spring AOP:使用纯java语言实现,不需要专门的编译过程和类加载器,在运行期间通过代理向目标类提供增强;

    那Spring中AOP使用是咋回事情呢?

    Spring长处并不是提供一个完整的Aop实现,它的长处就是整合其他各类AOP的实现。

    Spring在2.0之后,对于AOP的功能进行了重要的增强。

    1、新增加了基于Schema的配置支持,为AOP提供了命名空间;

    2、增加了对于Aspect切点表达式语言的支持;

    3、可以无缝的集成Aspect;

    对于JDK5的项目,推荐使用Spring中提供的@Aspect的配置方式,因为可以更简单更直接的应用切面;

    AOP的几个关键术语?

    JoinPoint:程序执行的特定位置,具有边界性质的特点,例如方法执行前,方法执行后;

    PointCut:通过PointCut来定位JoinPoint,数据库的概念来描述最为清楚,JoinPoint相当于数据库中的记录,PointCut相当于查询条件;

    Advice:植入到目标类连接点上的一段程序代码;

    Target:增强逻辑要植入的目标类;

    Introduction:引介是一种特殊的增强,为类添加一些属性和方法;

    Weaving:将增强添加到目标类连接点上的过程;

    Aspect:切面有切点和增强组成;

    Spring中使用AOP有几种方式?

    ​1、基于Advisor类的方式;

    ​2、基于@Aspect的方式;

    ​3、基于<aop:advisor>的方式(一种混血儿呵呵);

    ​4、基于<aop:aspect>的方式;

    ​Spring提供了很多选择,都得选择确实让人头疼。

如果是JDK5的工程,优先推荐@Aspect的方式,如果是低版本的JDK,则可以使用<aop:aspect>的方式;

如果是老系统改造,可以使用<aop:advisor>来复用之前的Advice类,如果是低版本的Spring,则只能只用Advisor类了;

    ​Spring有哪几种增强形式?

    ​五种,前置、后置、环绕、异常抛出、引介(增加方法和属性);

    ​

    ​参考书籍《spring 3.X企业应用开发实战》

    ​

相关推荐