2012-08-12 11 views
10

De Spring Documentation:objetivo de muelle AOP() vs este()

this(com.xyz.service.AccountService) 
  • :

    • cualquier punto (ejecución método sólo en la primavera de AOP), donde el proxy implementa la interfaz AccountService unen cualquier unen a punto (ejecución método sólo en la primavera de AOP) en el que el objeto de destino implementa la interfaz AccountService:

      target(com.xyz.service.AccountService) 
      

    No entiendo lo que significa "objeto de destino" y la expresión target(...).

    ¿Cómo es diferente de targetthis?

  • Respuesta

    17

    this(AType) significa que todos se unen los puntos donde this instanceof AType es cierto. Entonces, esto significa que en su caso una vez que la llamada llegue a cualquier método de AccountService this instanceof AccountService será verdadero.

    target(AType) significa que todos se unen los puntos donde anObject instanceof AType. Si está llamando a un método en un objeto y ese objeto es una instancia de AccountService, será un joinpoint válido.

    Para resumir de una manera diferente - this(AType) es desde una perspectiva de receptores, y target(AType) es desde una perspectiva de llamadas.

    +0

    Si consigo que la derecha ... tanto '' this' y target' hacen lo mismo ??? Una vez que mi código intenta ejecutar algún método de 'AccountService', entonces desde el punto de vista del receptor,' this instanceof AccountService' es verdadero; y desde el punto de vista del llamante 'calledObject instanceof AccountService' también es verdadero. Entonces, ¿por qué es esta redundancia? – rapt

    +0

    Importa en AspectJ, pero tiene razón, no tanto en Spring AOP, porque 'call' (normalmente utilizado con el objetivo) tejerá a la persona que llama, mientras que' execution' (junto con esto) tejerá la clase misma. Esto es importante, ya que con algo como el tiempo de compilación, puede que no tenga acceso a clases de terceros para tejer mediante la ejecución, luego puede tejer las llamadas a las bibliotecas de terceros. –

    +0

    Gracias por la explicación. – rapt

    9

    Sé que esta es una publicación anterior, pero me encontré con una diferencia importante entre esto y el objetivo sin usar AspectJ.

    Considérese el siguiente aspecto introducción:

    @Aspect 
    public class IntroductionsAspect { 
    
        @DeclareParents(value="a.b.c.D", defaultImpl=XImpl.class) 
        public static X x; 
    
        @After("execution(* a.b.c.D.*(..)) && this(traceable)") 
        public void x(Traceable traceable) { 
         traceable.increment(); 
        } 
    
    } 
    

    En pocas palabras, este aspecto está haciendo dos cosas:

    1. Hacer la clase a.b.c.D implementa la interfaz X.
    2. Agregando una llamada al traceable.increment() para ser ejecutado antes de cada método de a.b.c.D.

    La parte importante es "execution(* a.b.c.D.*(..)) && this(traceable)". Tenga en cuenta que utilicé este, no objetivo.

    Si utiliza objetivo lugar, usted está tratando de igualar la clase original a.b.c.D, no la interfaz introducido X. Entonces Spring AOP no encontrará ningún punto de unión en a.b.c.D.

    En resumen:

    este - Verifica el tipo de proxy o el tipo introducido. objetivo - Comprueba el tipo declarado.

    +0

    buen punto, gracias –