一、SpringAOP的专业概念

真实对象: 要进行功能扩展的对象

代理对象: 完成扩展功能后的对象

切点: 要进行功能扩展的具体方法(存在真实对象中)

前置通知方法: 在切点之前执行的扩展方法

后置通知方法: 在切点之后执行的拓展方法

切面: 由前置通知+切点+后置通知形成的横向执行的面

织入: 由前置通知+切点+后置通知形成切面的过程

二、创建前置通知方法

2.1 代码

public class Before implements MethodBeforeAdvice { //实现接口
    @Override
    public void before(Method method, Object[] objects, Object o) throws Throwable { //重写方法
        //前置方法具体内容
    }
}

2.2 参数说明

Method method: 切点的方法对象

Object[] objects: 代理对象中的扩展方法接收的实参数组,与切点的实参一致

Object o: 真实对象

三、创建后置通知方法

3.1 代码

public class After implements AfterReturningAdvice {  //实现接口
    @Override
    public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable { //重写方法
        //后置方法具体内容
    }
}

3.2 参数说明

**Object o:**切点执行后的返回值 **Method method:**切点的方法对象 **Object[] objects:**代理对象中的扩展方法接收的实参数组,与切点的实参一致 **Object o1:**真实对象

四、创建环绕通知方法

4.1 代码

public class Round implements MethodInterceptor { //实现接口
    @Override
    public Object invoke(MethodInvocation methodInvocation) throws Throwable { //重写方法
        System.out.println("环绕通知前代码");
        final Object proceed = methodInvocation.proceed(); //执行切点
        System.out.println("环绕通知后代码");
        return proceed; //切点的返回值
    }
}

4.2 参数说明

MethodInvocation methodInvocation: 该对象封装了前置通知和后置通知中的所有参数

五、创建异常通知方法

5.1 代码

public class Throw implements ThrowsAdvice { //实现接口
    public void afterThrowing(Exception e){ //!!注意:该接口不提供方法供重载使用,需自己创建,方法名不可改变
        System.out.println("异常通知");
    }
}

六、书写配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop" (默认不提供,需要手动添加)
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/aop (默认不提供,需要手动添加)
       http://www.springframework.org/schema/aop/spring-aop.xsd"> (默认不提供,需要手动添加)
    <bean id="a" class="com.pojo.TestA"></bean>
    //<!--配置拓展前-->
    <bean id="before" class="com.advice.Before"></bean>
    //<!--配置拓展后-->
    <bean id="after" class="com.advice.After"></bean>
    //<!--配置环绕通知-->
    <bean id="round" class="com.advice.Round"></bean>
    //<!--配置异常通知-->
    <bean id="throw" class="com.advice.Throw"></bean>
    //<!--配置拓展规则-->
    <aop:config>
        //<!--指明要经行功能扩展的方法-->
        <aop:pointcut id="mp" expression="execution(* com.pojo.TestA.testA())"/>
        //<!--组件-->
        <aop:advisor advice-ref="before" pointcut-ref="mp"></aop:advisor>
        <aop:advisor advice-ref="after" pointcut-ref="mp"></aop:advisor>
        //<!--环绕通知组件-->
        <aop:advisor advice-ref="round" pointcut-ref="mp"></aop:advisor>
        //<!--异常通知组件-->
        <aop:advisor advice-ref="throw" pointcut-ref="mp"></aop:advisor>
    </aop:config>
</beans>

注意事项

创建真实对象的实例时需要创建为真实对象所实现的接口的实例对象,代理对象和真实对象实现同一个接口