2008-09-02 4 views
7

내 프로젝트는 스프링 프레임 워크 2.5.4를 기반으로합니다. 그리고 나는 일부 컨트롤러 (aspectj 1.5.3 사용)에 대한 aspect를 추가하려고한다.Aspectj는 스프링 프레임 워크에서 모든 이벤트를 잡아 내지 못합니까?

내가 응용 프로그램-servlet.xml 파일에 자동 프록시를 설정 한

, 그냥 xml 파일의 끝에 다음 줄을 붙여 :

<aop:aspectj-autoproxy /> 
<bean id="auditLogProcessor" class="com.example.bg.web.utils.AuditLogProcessor" /> 

만든 측면 :

package com.example.bg.web.utils; 

import org.apache.log4j.Logger; 
import org.aspectj.lang.annotation.After; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Pointcut; 

@Aspect 
public class AuditLogProcessor 
{ 
    private final static Logger log = Logger.getLogger(AuditLogProcessor.class); 

    @After("execution(* com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail(..))") 
    public void afterHandleRequest() { 
     log.info("test111"); 
    } 

    @After("execution(* com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail(..))") 
    public void afterRebuildThumbnail() { 
     log.info("test222"); 
    } 
}

내 컨트롤러 :

class AssetAddController implements Controller 
class AssetThumbnailRebuildController extends MultiActionController

aspect 어드바이저에 브레이크 포인트를 설정하고 컨트롤러를 호출 할 때 afterHandleRequest() but afterRebildThumbnail() 내가 뭘 잘못 했니?

참고

내가 SO 베타에 액세스 할 수없는 내 친구 대신에이 질문을 부탁 해요, 나는 그것이 다 무슨 단서가 없습니다. 실제로 몇몇 철자 오류가 있었다

편집, 감사 Cheekysoft. 그러나 문제는 여전히 지속됩니다.

답변

2

중단 점은 당신이 Spring의 AOP 프록시를 사용하고 있기 때문에 명중되지 않습니다를 참조하십시오. AOP 프록시가 특수한 방법에 대한 설명은 understanding-aop-proxies을 참조하십시오.

기본적으로 MVC 프레임 워크는 컨트롤러 프록시 (예 : 기본 클래스로 사용하는 MultiActionController)에서 handleRequest 메서드를 호출하므로이 메서드는 해당 rebuildThumbnail에 대한 "내부"호출을 수행합니다 메소드를 호출하지만 프록시를 통해 전달되지 않으므로 어떠한 측면도 고려하지 않습니다. (이것은 최종 방법과는 아무런 관련이 없습니다.)

로드 시간 짜기를 통해 "진짜"AOP를 사용하여 조사하십시오 (Spring이 매우 잘 지원합니다).

0

맞춤법처럼 간단합니까? 또는 질문에 오타가 있습니까? 때때로 당신이 rebuildThumbnail 작성하고 bpapas 대답은 유용 동안 있도록 조언을 무시하려고하는 방법은 MVC 프레임 워크에 마지막 방법은 아니다 때로는 rebildThumbnail

쓰기, 나의 이해는이 문제가이 아닌 것입니다 케이스. 그러나 rebuildThumbnail 컨트롤러 동작이 최종적이 아닌지 확인하십시오.

@bpapas : 틀렸을 경우 제발 정정하십시오. 프로그래머 자신의 컨트롤러 동작은 그가 대체하려고하는 것입니다. MultiActionController 소스 (및 그 부모)를 보면 잠재적으로 스택에있는 유일한 최종 메소드는 MultiActionController.invokeNamedMethod입니다.하지만 그 시간에 스택에 있어야하는지 100 % 확신 할 수는 없습니다. 최종 메서드가 스택 위로 올라가면 AOP 조언을 메서드에 추가로 추가 할 수 있습니까?

1

기본 설정이 정상적으로 보입니다.

내부적 인 포인트 컷을 정의하지 않고 사후 조언을 적용 할 방법을 지정하면 구문을 약간 단순화 할 수 있습니다. (메서드의 명명 된 pointcuts는 자동으로 생성됩니다.)

예 :

@After("com.example.bg.web.controllers.assets.AssetAddController.handleRequest()") 
public void afterHandleRequest() { 
    log.info("test111"); 
} 

@After("com.example.bg.web.controllers.assets.AssetThumbnailRebuildController.rebuildThumbnail()") 
public void afterRebuildThumbnail() { 
    log.info("test222"); 
} 

만큼 rebuildThumbnail 방법은 최종이 아니며, 메소드 이름과 계급이 올바른지한다. 왜 이것이 작동하지 않을지 모르겠다.

http://static.springframework.org/spring/docs/2.0.x/reference/aop.html

관련 문제