2016-11-08 3 views
0

Ich versuche, eine Methode auszuführen, bevor der Setter einer Klasse mit @Entity notiert aufgerufen wird. So habe ich diesen Code jetzt:AspectJ arbeitet nicht mit Klassen ohne Schnittstelle

@Component 
@Aspect 
public class Observable { 

@Before("execution(* br.com.persistence.Transaction.setStatus(..))") 
public void beforeSetStatus(JoinPoint joinPoint) { 
    System.out.println(joinPoint.getSignature().getName()); 
} 
} 

Mein pom.xml:

  <dependency> 
       <groupId>org.aspectj</groupId> 
       <artifactId>aspectjrt</artifactId> 
       <version>1.6.1</version> 
      </dependency> 
      <dependency> 
       <groupId>org.aspectj</groupId> 
       <artifactId>aspectjtools</artifactId> 
       <version>1.6.1</version> 
      </dependency> 
      <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-aop</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 
     ... 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>aspectj-maven-plugin</artifactId> 
      <version>1.7</version> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
       <complianceLevel>1.6</complianceLevel> 
      </configuration> 
      <executions> 
       <execution> 
        <goals> 
         <goal>compile</goal> 
        </goals> 
       </execution> 
      </executions> 
      <dependencies> 
       <dependency> 
        <groupId>org.aspectj</groupId> 
        <artifactId>aspectjrt</artifactId> 
        <version>1.8.5</version> 
       </dependency> 
       <dependency> 
        <groupId>org.aspectj</groupId> 
        <artifactId>aspectjtools</artifactId> 
        <version>1.8.5</version> 
       </dependency> 
      </dependencies> 
     </plugin> 

Und in spring.xml fügte ich hinzu:

<aop:aspectj-autoproxy proxy-target-class="true"/> 

Wenn ich versuche, eine Schnittstelle Pointcut , es funktioniert richtig, aber es funktioniert nicht mit Klassen in Persistenz. Ich weiß nicht, ob das daran liegt, dass sie keine Schnittstelle implementieren oder wegen der Annotation @Entity, die beunruhigend ist.

+1

Sie müssen beachten, dass Sie mit dieser Konfiguration, die Sie oben aufgeführt haben, Spring AOP und __not__ AspectJ verwenden. –

+0

Kann ich mit Spring AOP erreichen, was ich will? Um eine Klasse ohne Schnittstelle zu zeigen? –

+1

Spring AOP gilt nur für Bohnen im Frühling. Ich bin mir nicht sicher, worauf du einen Aspekt anwenden willst. Siehe diese Frage für eine Erklärung http://stackoverflow.com/q/1606559/2699901 –

Antwort

1

Damit die Proxies zur Laufzeit erstellt werden, sollte Ihre Klasse entweder eine Schnittstelle haben oder Sie sollten cglib (wie in Ihrem Fall) konfigurieren. http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/aop.html

+0

Die Transaction-Klasse ist keine Bean, kann ich pointcut es mit @Aspect, jay? –

+0

Wenn Sie Spring AOP verwenden, sollten alle Ihre Objekte "federgeführt" sein. Da Spring zum Erstellen von Proxies zur Laufzeit benötigt wird und dies nicht möglich ist, es sei denn, Sie konfigurieren es so, dass es innerhalb des "Spring-Kontexts" liegt. Wenn Sie Spring jedoch nicht für andere Anwendungsfälle verwenden, könnten Sie AspectJ in Betracht ziehen, bei dem es sich um ein anderes Framework handelt. Mit AspectJ sollten Sie dies tun können - http://stackoverflow.com/questions/1606559/spring-aop-vs-aspectj – jay

+0

Aparently kann Spring ein Objekt mit @Configurable verwalten. Ist es einfacher, diese Arbeit zu machen, als nach AspectJ selbst zu migrieren? Mein Projekt verwendet Spring überall, mit Ausnahme der Persistenz, die von Hibernate verwaltet wird –

Verwandte Themen