Spring应用手册-AOP(XML)-(14)-AOP-XML-advisor-方式环绕通知

x33g5p2x  于2021-09-26 转载在 Spring  
字(1.7k)|赞(0)|评价(0)|浏览(523)

AOP-XML-advisor-方式环绕通知

spring应用手册(第四部分)

advisor的环绕通知,我们的通知类需要实现接口:MethodInterceptor,源码如下:

package org.aopalliance.intercept;

@java.lang.FunctionalInterface
public interface MethodInterceptor extends org.aopalliance.intercept.Interceptor {
    /** * 这里的参数methodInvocation扩展自Joinpoint, * 提供了获取目标对象,获取目标方法,获取目标方法参数列表的API。 * 最终要的是提供了一个proceed方法,这个方法就是用来执行目标方法的。 * @param methodInvocation * @return * @throws Throwable */
    @Override
    public Object invoke(MethodInvocation methodInvocation) throws Throwable ;
}

我们自己定义一个环绕通知:

/** * @author 戴着假发的程序员 * @company http://www.boxuewa.com * @description */
public class DkAroundAdvice implements MethodInterceptor {
    /** * 这里的参数methodInvocation扩展自Joinpoint, * 提供了获取目标对象,获取目标方法,获取目标方法参数列表的API。 * 最终要的是提供了一个proceed方法,这个方法就是用来执行目标方法的。 * @param methodInvocation * @return * @throws Throwable */
    @Override
    public Object invoke(MethodInvocation methodInvocation) throws Throwable {
        System.out.println("环绕通知开始--");
        System.out.println("目标对象:"+methodInvocation.getThis());
        System.out.println("被增加方法:"+methodInvocation.getMethod().getName());
        System.out.println("方法参数列表:"+ Arrays.toString(methodInvocation.getArguments()));
        //定义返回值
        Object retVal = null;
        //执行业务方法
        retVal = methodInvocation.proceed();
        System.out.println("环绕通知结束--");
        return retVal;
    }
}

注意这里的环绕通知和注解的环绕通知一样,都是在我们的拦截方法中执行业务方法,所以我们可以这我们的增强业务中根据条件选择执行业务方法或者不执行业务方法,可以调整业务方法的返回值。

配置环绕通知:

<!-- 环绕通知类注册 -->
    <bean id="aroundAdvice" class="com.st.advices.DkAroundAdvice"/>
<!-- AOP配置 -->
    <aop:config>
            <!-- 声明一个切入点,命名为pointcut1 -->
        <aop:pointcut id="pointcut1" expression="execution(* com.st.beans..*.*(..))"/>
        <!-- 异常通知配置-->
        <aop:advisor advice-ref="aroundAdvice" pointcut-ref="pointcut1"/>
    </aop:config>

执行业务方法测试结果:

相关文章