2016-11-08 11 views
0

Я пытаюсь выполнить метод до того, как вызывается сеттер класса с именем @Entity. Поэтому у меня есть этот код сейчас:AspectJ не работает с классами без интерфейса

@Component 
@Aspect 
public class Observable { 

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

Мой 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> 

И в spring.xml я добавил:

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

Если я пытаюсь Pointcut интерфейс , он работает правильно, но он не работает с классами в настойчивости. Я не знаю, связано ли это с тем, что они не реализуют интерфейс или из-за аннотации @Entity, которая вызывает беспокойство.

+1

Вы должны знать, что с этой конфигурацией, указанной выше, вы используете Spring AOP и __not__ AspectJ. –

+0

Могу ли я достичь того, что хочу с Spring AOP? Называть класс без интерфейса? –

+1

Spring AOP применяется только к весенним управляемым бобам. Я не уверен, к чему вы пытаетесь применить аспект. См. Этот вопрос для объяснения http://stackoverflow.com/q/1606559/2699901 –

ответ

1

Для того чтобы прокси создавались во время выполнения, ваш класс должен иметь либо интерфейс, либо настроить cglib (как в вашем случае). http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/aop.html

+0

Класс транзакции не является компонентом, могу ли я указывать его на @Aspect, jay? –

+0

Если вы используете Spring AOP, тогда все ваши объекты должны быть «управляемыми весной». Поскольку Spring потребует создания прокси-серверов во время выполнения, и он не может этого сделать, если вы не настроите его на «весенний контекст». Однако, если вы не используете Spring для каких-либо других случаев использования, вы можете рассмотреть возможность использования AspectJ, который представляет собой другую структуру. С AspectJ вы должны это сделать - http://stackoverflow.com/questions/1606559/spring-aop-vs-aspectj – jay

+0

Я могу заставить Spring управлять объектом с @Configurable. Легче ли сделать эту работу, чем перейти на AspectJ? Мой проект использует Spring везде, за исключением сохранения, который управляется Hibernate –