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

举报
小工匠 发表于 2021/09/09 23:50:30 2021/09/09
【摘要】 概述实例 概述 后置增强在目标方法调用后执行. 实例 代码已托管到Github—> https://github.com/yangshangwei/Spring...

概述

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

实例

代码已托管到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);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

业务实现类

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);
    }

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

业务增强类

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!");
    }

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

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

<?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>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

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");
    }

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

运行结果

这里写图片描述

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

文章来源: artisan.blog.csdn.net,作者:小小工匠,版权归原作者所有,如需转载,请联系作者。

原文链接:artisan.blog.csdn.net/article/details/77187128

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。