Spring AOP изпълнение на поръчка

Нов съм в 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 ****
....

Какъв е проблема? Има ли начин да се поправи това?


person hguser    schedule 13.02.2014    source източник


Отговори (1)


Това е просто резултат от извършването на изход на два различни изходни потока. Пишеш и на err, и на out. Те не е задължително да се изчистват в същия ред (между потоците ).

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

което е в точния ред, в който сте ги задали.

person Sotirios Delimanolis    schedule 13.02.2014
comment
също така можете да промивате с помощта на System.out.flush() и System.err.flush() - person Elvis Kim; 13.02.2014