一、AOP概念

        AOP(Action oriented programming):面向切面编程

        AOP的作用:它可以让我们“专心做事”,专心处理业务逻辑代码。不用关心:日志记录、事务控制及权限控制等。        

        使用 spring的 aop可以解决两个问题:
            1.Java EE程序员在编写具体的业务逻辑处理方法时,只需关心核心的业务逻辑处理,既提高了工作效率,又使代码变更简洁优雅。
            2.在日后的维护中由于业务逻辑代码与其它共有代码分开存放,而且共有代码是集中存放,从而使维护工作变得简单轻松。

        AOP中关键性概念:
           1切面-【Aspect】:切面就是共有功能的实现。如日志切面、权限切面、事务切面等。在实际应用中通常是一个存放共有功能实现的普通 Java类,之所以能被AOP容器识别成切面,是在配置中指定的。
           2通知-【Advice】:通知又名拦截器,它的意思是在某个特定的连接点上执行的动作,它是切面的具体实现。以目标方法为参照点,根据放置的地方不同,通知分为如下几种:
        前置通知-Before,实现MethodBeforeAdvice接口。     ===》目标方法调用之前执行;
        后置通知-After,实现AfterReturningAdvice接口。        ===》目标方法调用之后执行;
        返回通知-After-returning。                ===》目标方法执行成功之后执行;
        异常通知-After-throwing。                ===》目标方法抛出异常后执行;
        环绕通知-Around,实现MethodInterceptor接口。    ===》目标方法执行前后都会执行,相等于合并了前置和后置通知。
          3连接点-【Joinpoint】:程序在运行过程中能够插入切面的地点。例如,方法调用、异常抛出或返回值等,Spring只支持方法级的连接点。
          4切入点-【Pointcut】:多个连接点的集合,用于定义通知应该切入到哪些连接点上。不同的通知通常需要切入到不同的连接点上,这种精准的匹配是由切入点的正则表达式来定义的。
          5目标对象-【Target】:即将切入切面的对象,也就是那些被通知的对象。这些对象中已经只剩下干干净净的核心业务逻辑代码了(其实就是只有业务逻辑代码的java类),所有的共有功能代码等待AOP容器的切入。
          6代理对象-【Proxy】:将通知应用到目标对象之后被动态创建的对象。代理=目标+通知,注意:只有代理对象才有AOP功能,而AOP的代码是写在通知的方法里面的。
          7织入-【Weaving】:将切面应用到目标对象从而创建一个新的代理对象的过程。这个过程可以发生在编译期、类装载期及运行期,当然不同的发生点有着不同的前提条件。譬如发生在编译期的话,就要求有一个支持这种AOP实现的特殊编译器;发生在类装载期,就要求有一个支持AOP实现的特殊类装载器;只有发生在运行期,则可直接通过Java语言的反射机制与动态代理机制来动态实现。
          8适配器-【Advisor】:适配器=通知(Advice)+切入点(Pointcut)。Java中的适配器就是可以把一种接口转换成另一种接口的对象,Spring AOP 模块对 BeforeAdvice、 AfterAdvice、 ThrowsAdvice 三种通知类型的支持实际上是借助适配器模式来实现的。