Aspect————后置通知

本文通过一个例子展示了如何在Spring AOP中使用后置通知(@AfterReturning)修改目标方法的返回值。在代理类中,我们检查目标方法的返回值类型,如果是String则将其转换为大写,如果是Student对象则修改其name属性。测试结果显示,后置通知成功实现了返回值的转换。
摘要由CSDN通过智能技术生成

配置与前置通知一样

代理类

@Aspect
@Component
public class MyAspect {
    /**
     * 后置通知方法的规范
     * 1)访问权限是public
     * 2)方法没有返回值void
     * 3)方法名称自定义
     * 4)方法有参数(也可以没有参数,如果目标方法没有返回值,则可以写无参的方法,
     * 但一旦写有参,这样可以处理无参可以处理有参),
     * 这个切面的参数就是目标方法的返回值
     * 5)使用@AfterReturning注解标明是后置通知
     *      参数有俩
     *          value:指定切入点表达式
     *          returning:指定目标方法的返回值的名称,则名称必须与方法的参数名称一致
     *
     *
     */
    @AfterReturning(value = "execution(* com.wzx.s02.*.*(..))",returning = "obj")
    public void myAfterreturning(Object obj){
        System.out.println("后置通知功能实现..............");
    }

}

测试类

  @Test
    public void test2(){
        ApplicationContext ac=new ClassPathXmlApplicationContext("s02/applicationContext.xml");
        SomeService someService= (SomeService) ac.getBean("someServiceImpl");
        String password = someService.doSome("asd", 21);
        System.out.println("在测试方法中目标方法的返回值"+password);
    }

 转换类型

        将小写转换为大写转换失败

 @AfterReturning(value = "execution(* com.wzx.s02.*.*(..))",returning = "obj")
    public void myAfterreturning(Object obj){
        System.out.println("后置通知功能实现..............");

        if (obj != null) {
            if (obj instanceof String ) {           //判断obj是不是String类型用instanceof
               obj=obj.toString().toUpperCase() ;
                System.out.println("在切面方法中目标方法的返回值"+obj);
            }
        }
    }

转换类型

        将张三转换为李四转换成功

新建一个Student类

public class Student {
    private String name;

    public Student() {
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Student(String name) {
        this.name = name;
    }
}

更改接口

public interface SomeService {
    String doSome(String name,int age);
    Student change();
}

更改实现类

@Service
public class SomeServiceImpl implements SomeService{
    @Override
    public String doSome(String name, int age) {
        System.out.println("doSome()业务方法被执行............");
        return "abcd";
    }

    @Override
    public Student change() {
        System.out.println("change()方法被执行.......");
        return new Student("张三");
    }
}

更改代理类

@Aspect
@Component
public class MyAspect {
    /**
     * 后置通知方法的规范
     * 1)访问权限是public
     * 2)方法没有返回值void
     * 3)方法名称自定义
     * 4)方法有参数(也可以没有参数,如果目标方法没有返回值,则可以写无参的方法,
     * 但一旦写有参,这样可以处理无参可以处理有参),
     * 这个切面的参数就是目标方法的返回值
     * 5)使用@AfterReturning注解标明是后置通知
     *      参数有俩
     *          value:指定切入点表达式
     *          returning:指定目标方法的返回值的名称,则名称必须与方法的参数名称一致
     *
     *
     */
    @AfterReturning(value = "execution(* com.wzx.s02.*.*(..))",returning = "obj")
    public void myAfterreturning(Object obj){
        System.out.println("后置通知功能实现..............");

        if (obj != null) {
            if (obj instanceof String ) {           //判断obj是不是String类型用instanceof
               obj=obj.toString().toUpperCase() ;
                System.out.println("在切面方法中目标方法的返回值"+obj);
            }
            if(obj instanceof Student){
                Student stu=(Student) obj;
                stu.setName("李四");
                System.out.println("在切面方法中目标方法的返回值:"+stu);
            }
        }
    }

}

测试类

  @Test
    public void test3(){
        ApplicationContext ac=new ClassPathXmlApplicationContext("s02/applicationContext.xml");
        SomeService someService= (SomeService) ac.getBean("someServiceImpl");
        Student stu=someService.change();
        System.out.println("在测试方法中目标方法的返回值"+stu);
    }

 

 

ps:如果目标方法的返回值是8中基本类型或String的类型,则不可改变

        如果目标方法的返回值是引用类型,则可以改变

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值