【问题标题】:Spring AOP execute orderSpring AOP 执行顺序
【发布时间】:2014-02-13 06:35:06
【问题描述】:

我是 Spring AOP 的新手,这是我的测试代码:

com.kk.entitypackage 内部的目标:

@Component
public class AopTargetOne {
    private String name;
    private String password;
    private String email;
    private String address;

    //getter and setters omitted
}

@Component
public class AopTargetSecond {
    private String name;
    private int age;
    private String email;
    //getter and setters omitted
}

方面:

@Component
@Aspect
public class VariableCheckAspect {

    //intercept all the setter methods
    @Pointcut("execution(* com.kk.entity.*.set*(..))")
    private void aopIsSetMethod() {

    }

    @Before("com.kk.aop.VariableCheckAspect.aopIsSetMethod() && args(val,..)")
    public void checkSetValue(JoinPoint joinpoint, String val) {
        System.err.println("******** Start check set value  with method *********** " + joinpoint.getSignature());
        System.out.println("value is:" + val);
        System.err.println("********  End ****");
    }
}

应用:

    AopTargetOne ah = context.getBean(AopTargetOne.class);
    ah.setAddress("aopholder address");
    ah.setEmail("aopholder email");
    ah.setName("aopholder name");

    AopTargetSecond ak = (AopTargetSecond) context.getBean("aopTargetSecond");
    ak.setName("aopkepper name");
    ak.setEmail("aopkepper email");
    ak.setAge(23);

我得到了输出:

******** Start check set value  with method *********** void com.kk.entity.AopTargetOne.setAddress(String)
********  End ****
value is:aopTargetOne address
******** Start check set value  with method *********** void com.kk.entity.AopTargetOne.setEmail(String)
********  End ****
******** Start check set value  with method *********** void com.kk.entity.AopTargetOne.setName(String)
********  End ****
******** Start check set value  with method *********** void com.kk.entity.AopTargetTwo.setName(String)
********  End ****
value is:aopTargetOne email
value is:aopTargetOne name
value is:aopTargetTwo name
******** Start check set value  with method *********** void com.kk.entity.AopTargetTwo.setEmail(String)
********  End ****
value is:aopTargetTwo email

这让我很困惑!代码似乎没有按正常顺序运行。

虽然我希望输出是这样的:

******** Start check set value  with method *********** void com.kk.entity.AopTargetOne.setAddress(String)
value is:aopTargetOne address
********  End ****
******** Start check set value  with method *********** void com.kk.entity.AopTargetOne.setEmail(String)
value is:aopTargetOne email
********  End ****
....

有什么问题?有什么办法解决这个问题?

【问题讨论】:

    标签: java spring aop spring-aop


    【解决方案1】:

    这只是您在两个不同的输出流上执行输出的结果。您正在写信给erroutThese don't necessarily get flushed in the same order (between streams).

    System.err.println(..);
    System.out.println(..);
    

    写入相同的OutputStream,您将看到预期的输出。

    如果我们删除包含星星的输出,我们得到

    value is:aopTargetOne address
    value is:aopTargetOne email
    value is:aopTargetOne name
    value is:aopTargetTwo name
    value is:aopTargetTwo email
    

    这与您设置它们的确切顺序相同。

    【讨论】:

    • 您也可以使用 System.out.flush() 和 System.err.flush() 进行刷新
    猜你喜欢
    • 2020-02-06
    • 2016-09-23
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 2011-09-20
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多