2017-10-01 3 views
0

Je ne pouvais pas comprendre différent entre l'intérieur et l'indicateur de point de cible. Regardez l'exemple:Printemps AOP, dans le but vs désignation de la cible

@Component 
public interface Icamera { 
    public void snap() throws Exception; 
} 

@Component 
class Camera implements Icamera{ 
    public void snap() throws Exception { 
     System.out.println("SNAP!"); 

    } 
} 


@Aspect 
@Component 
public class Logger { 

**@Pointcut("within(com.test.aop.Icamera)")** 
public void cameraSnap() { 
} 

@Before("cameraSnap()") 
public void beforeAdvice() { 
    System.out.println("Before advice ..."); 
} 

@After("cameraSnap()") 
public void afterAdvice() { 
    System.out.println("After advice ..."); 
} 

public static void main(String[] args) throws Exception { 
    ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); 
    Icamera camera=context.getBean(Icamera.class); 
    camera.snap(); 
} 

}

La sortie est: SNAP! mais lorsque vous utilisez cible au lieu de à l'intérieur, la sortie est: Avant conseil ... SNAP! Après des conseils ...

Répondre

0

documentation de printemps est pas particulièrement claire, mais ils fournissent la référence complète des types de point d'action AspectJ pris en charge: https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#aop-pointcuts

En cas de votre exemple

dans les - limites correspondant joindre des points dans certains types (simplement l'exécution d'une méthode déclarée dans un type correspondant lors de l'utilisation de Spring AOP)

Donc le type de @Component réel recevant l'appel de méthode doit correspondre au sélecteur dans within. Il intercepte l'appel si vous spécifiez le nom de la classe de haricot

@Pointcut("within(com.test.aop.Camera)") 

sélecteur de paquet

@Pointcut("within(com.test.aop.*)") 

ou d'un package parent avec des sous-packages sélecteur

@Pointcut("within(com.test..*)") 

cible - limites correspondant à des points de jonction (l'exécution de méthodes lors de l'utilisation Spring AOP) où l'objet cible (appl objet ication étant approximé) est une instance de la documentation Comme l'indique le type donné

applique la méthode fait appel à tous les haricots où <beanClass> instanceof <targetType> Equivaut à true.