2016-04-29 13 views
1

Frage: Kann Spring-Point-Cut-Ausdrücke auf nicht verwalteten Federkomponenten wie Domänenobjekt ausgeführt werden? Aus meinen Experimenten sieht es so aus, nicht, also was ist der beste Weg, um Pointcut-Ausdrücke auf einem regulären Objekt auszuführen?AspectJ Pointcut-Ausdruck auf Domänenobjekten, die nicht von Spring verwaltet werden

Ich habe den benutzerdefinierten Annotationsnamen @Encrypt erstellt, sodass das Feld, wenn es über einem Feld in einem Domänenobjekt verwendet wird, an einen Webdienst gesendet und automatisch verschlüsselt wird.

Ich begann zuerst mit Annotation auf Methodenebene und fand, dass Punktschnittausdruck nicht auf Objekten funktioniert, die nicht von Spring verwaltet werden, es muss eine Frühlingsbohne sein.

1. Frühling Aspekt: ​​ Checks für benutzerdefinierte Anmerkung @Encrypt und druckt.

@Aspect 
public class EncryptAspect { 

    @Around("@annotation(encrypt)") 
    public Object logAction(ProceedingJoinPoint pjp, Encrypt encrypt) 
      throws Throwable { 

     System.out.println("Only encrypt annotation is running!"); 
     return pjp.proceed(); 
    } 
} 

2. Individuelle Annotation:

@Documented 
@Target(ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME) 

public @interface Encrypt 
{ 
    // Handled by EncryptFieldAspect 
} 

3. Domain-Objekt mit Annotation

public interface CustomerBo { 
    void addCustomerAround(String name); 
} 

public class CustomerBoImpl implements CustomerBo {  
    @Encrypt 
    public void addCustomerAround(String name){ 
     System.out.println("addCustomerAround() is running, args : " + name); 
    } 
} 

4. Invocation

 ApplicationContext appContext = new ClassPathXmlApplicationContext("http-outbound-config.xml"); 
//  CustomerBoImpl customer = new CustomerBoImpl(); --> Aspect is not fired if object is created like this. 
     CustomerBo customer = (CustomerBo) appContext.getBean("customerBo"); // Aspect Works 
     customer.addCustomerAround("test"); 
+0

Dies scheint ein XY zu sein Problem (siehe: http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Könnten Sie bitte erklären, wann die Verschlüsselung ausgeführt werden soll? Mit anderen Worten, das Problem, das Sie versuchen zu lösen. – Apokralipsa

+0

@Apokralipsa Ich habe meine Frage aktualisiert, hoffe, das macht es klar. –

Antwort

2

Zu Ihrer ersten Frage ("Können Spring-Point-Cut-Ausdrücke auf nicht verwalteten Federkomponenten wie einem Domänenobjekt ausgeführt werden?") Lautet die Antwort Nein. Spring reference manual has a chapter that exactly explains how Spring AOP works and why it won't work in that case.

Die Optionen, die ich sehen sind (in der Reihenfolge, wie ich würde dieses Problem höchstwahrscheinlichen Ansatz):

  1. den Aspekt Droping und diese Invarianten in einem Dienst oder eine Fabrik Einkapselung, die CustomerBo ‚s schafft. Es wäre am besten, wenn CustomerBoImpl unveränderlich wäre, so dass Sie nicht befürchten müssten, dass es entschlüsselt und in diesem falschen Zustand belassen wird.
  2. Wenn Sie Java Persistence API (JPA) verwenden, um Ihre Domänenobjekte persistent zu machen, und wenn die Verschlüsselung gerade ausgeführt werden soll, bevor Sie sie in der Datenbank speichern, sollten Sie listeners verwenden in der Dokumentation von Hibernate, die
  3. die nukleare Option einer der Implementierungen von JPA) ist - tatsächlich mit AspectJ Schalt die Beratung Konstrukteurs vorstellen kann, Änderungen Feldwert usw.
+0

Danke, ich entschied mich für AspectJ. Könnten Sie auch versuchen, diese Frage zu beantworten, die ich auf AspectJ habe .. http://Stackoverflow.com/questions/36974974/converting-code-based-style-to-annota-based-style-aop-using-spring-or- Aspekt –

Verwandte Themen