首页 > 代码库 > JavaEE--Spring_AOP

JavaEE--Spring_AOP

一、AOP概念

   1、aop:面向切面编程,扩展功能不用修改源代码实现

   2、AOP采取横向抽取机制,取代了传统的纵向继承体系重复代码

   3、AOP底层采用动态代理实现

      (1)有接口的情况,用动态代理创建接口实现类的代理对象

      (2)没有接口的情况,用动态代理创建子类的代理对象

    扩展功能的实现:

      (1)public class User{

          public void add(){

            System.out.println("add-----");

            System.out.println("添加日志");//通过修改源代码扩展功能

          }

          }

      (2)纵向抽取机制解决

        public class BaseUser{

         public void writeLog(){

            System.out.println("添加日志");

          }

        }

        public class User extends BaseUser{

          public void add(){

            System.out.println("add-----");

            //调用父类方法实现日志扩展功能

            super.writeLog();

          }

        }

       (3)动态代理解决

          有接口:使用jdk动态代理

          无接口:使用cglib动态代理

二、配置文件实现AOP操作

    1、aop的常用术语

        连接点:类中的那些方法可以被增强,这些方法称为连接点

        切入点:实际被增强的方法

        增强/通知:增强的逻辑被称为增强,比如日志扩展功能,这个日志功能就称为增强

          前置通知:在方法之前执行

          后置通知:在方法之后执行

          异常通知:方法出现异常

          最终通知:在后置之后执行

          环绕通知:在方法之前和方法之后执行

        切面:把增强引入到具体方法上,这个过程称为切面

     2、AspectJ简介

       AspectJ是一个面向切面的框架,它本身不属于Spring的一部分,Spring2.0以后新增了对它的支持

     3、使用表达式配置切入点

        execution(<方法修饰符>?<返回类型><方法名>(<参数>) <异常>)

          execution(* com.spring.aop.User.add(..))

          execution(* save*(..))匹配所有save开头的方法

     4、具体配置

        <bean id="user" class=="全路径"></bean>

        <bean id="myuser" class=="全路径"></bean>

        aop配置

        <aop:config>

          配置切入点

          <aop:pointcut expression="execution(* com.spring.aop.User.add(..))" id="pointcut01"/>

          配置切面

          <aop:aspect ref="myuser">

            配置前置增强

            <aop:before method="增强类的方法名" pointcut-ref="pointcut01"/>

          </aop:aspect>

        </aop:config>

    5、环绕通知增强类的代码

        public class myuser{

          public void writeLog(ProceedingJoinPoint joinPoint){

            System.out.println("方法之前");

            joinPoint.proceed();//执行被增强方法

            System.out.println("方法之后");

          }

        }

三、注解方式实现AOP操作

    1、创建对象

        <bean id="user" class=="全路径"></bean>

        <bean id="myuser" class=="全路径"></bean>

     2、开启AOP操作

        <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

     3、具体实现

      @Aspect

      public class MyUser{

        @Before(value="http://www.mamicode.com/execution(* User全路径.add(..))")

        public void before(){}//增强方法

      }

      public class User{

        public void add(){}//被增强方法

      }

JavaEE--Spring_AOP