2016-11-08 6 views
0

@Entity로 언급 된 클래스의 setter가 호출되기 전에 메소드를 실행하려고한다. 그래서 나는 지금이 코드를 가지고 :인터페이스가없는 클래스에서 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"/> 

내가 인터페이스를 포인트 컷하려고하면 , 제대로 작동하지만 클래스에서 지속성이 작동하지 않습니다. 그들이 인터페이스를 구현하지 않았거나 @Entity 어노테이션이 잘못 되었기 때문에 이것이 맞는지는 모르겠습니다.

+1

위에서 설명한 구성을 사용하면 Spring AOP와 __not__ AspectJ를 사용하고 있음을 알아야합니다. –

+0

Spring AOP로 원하는 것을 얻을 수 있습니까? 인터페이스없이 클래스를 pointcut하려면? –

+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

Transaction 클래스가 Bean이 아니므로 @Aspect, jay로 포인트 컷 할 수 있습니까? –

+0

Spring AOP를 사용한다면 모든 객체는 "스프링 관리"되어야합니다. Spring은 런타임에 프록시를 생성해야하므로 "스프링 컨텍스트"내에 있지 않으면 프록시를 구성 할 수 없습니다. 그러나 다른 유스 케이스에서 Spring을 사용하지 않는다면 다른 프레임 워크 인 AspectJ를 살펴볼 수있다. AspectJ를 사용하면이 작업을 수행 할 수있다. http://stackoverflow.com/questions/1606559/spring-aop-vs-aspectj – jay

+0

Aparently @Configurable으로 Spring을 관리 할 수있다. AspectJ 자체로 마이그레이션하는 것보다 쉽게 ​​작업 할 수 있습니까? 내 프로젝트는 Hibernate에 의해 관리되는 지속성을 제외하고는 어디에서나 Spring을 사용합니다. –