Spring-AOP 通过配置文件实现 后置增强

概述

后置增强在目标方法调用后执行.

实例

代码已托管到Github—> https://github.com/yangshangwei/SpringMaster

例如上面的例子中,在服务生每次服务后,也需要向客人问候,可以通过后置增强来实施这一要求,步骤如下:

创建业务接口类:Waiter.java
创建业务实现类:NativeWaiter.java
创建业务增强类:GreetingAfterAdvice.java
创建配置文件:conf-advice.xml
创建增强测试类:AfterReturingAdviceTest.java

这里写图片描述

业务接口类

package com.xgj.aop.spring.advice.afterRetruingAdivce;

public interface Waiter {

    void greetTo(String name);

    void serverTo(String name);
}

业务实现类

package com.xgj.aop.spring.advice.afterRetruingAdivce;

public class NaiveWaiter implements Waiter {

    @Override
    public void greetTo(String name) {
        System.out.println("greetTo " + name);
    }

    @Override
    public void serverTo(String name) {
        System.out.println("serverTo " + name);
    }

}

业务增强类

package com.xgj.aop.spring.advice.afterRetruingAdivce;

import java.lang.reflect.Method;

import org.springframework.aop.AfterReturningAdvice;

public class GreetingAfterAdvice implements AfterReturningAdvice {

    /**
     * 后置增强代码实现,在目标方法执行后调用
     * 
     * @param returnValue
     *            代理返回对象
     * @param method
     *            目标对象方法
     * @param args
     *            目标对象方法参数
     * @param target
     *            目标对象
     * @throws Throwable
     */
    @Override
    public void afterReturning(Object returnValue, Method method,
            Object[] args, Object target) throws Throwable {

        System.out.println("please enjoy youself,Sir!");
    }

}

在配置文件中对其进行配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="target" class="com.xgj.aop.spring.advice.afterRetruingAdivce.NaiveWaiter"/>

    <bean id="greetingBeforeAdvice" class="com.xgj.aop.spring.advice.proxyFactory.GreetingBeforeAdvice"/>
    <bean id="greetingAfterAdvice" class="com.xgj.aop.spring.advice.afterRetruingAdivce.GreetingAfterAdvice"/>

    <bean id="waiter" class="org.springframework.aop.framework.ProxyFactoryBean"
        p:proxyInterfaces="com.xgj.aop.spring.advice.afterRetruingAdivce.Waiter"
        p:interceptorNames="greetingBeforeAdvice,greetingAfterAdvice"
        p:target-ref="target"/>

</beans>

interceptorNames 是String[]类型的,它接收增强Bean的名称而非增强Bean的实例。这是因为ProxyFactory内部在省城代理类时,需要使用增强Bean得嘞,而非增强Bean的实例,以织入增强类中所写的横切代码逻辑。

测试类

package com.xgj.aop.spring.advice.afterRetruingAdivce;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AfterReturingAdviceTest {

    @Test
    public void test() {
        ApplicationContext ctx = new ClassPathXmlApplicationContext(
                "classpath:com/xgj/aop/spring/advice/afterRetruingAdivce/conf-advice.xml");

        Waiter waiter = ctx.getBean("waiter", Waiter.class);
        waiter.greetTo("Xiao");
        waiter.serverTo("GongJiang");
    }

}

运行结果

这里写图片描述

可以看到,前置、后置增强中的逻辑都成功的织入到目标类NaiveWaiter方法所对应的连接点上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小工匠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值