2011-03-12 1 views
0
에 @Pointcut 정보를 얻기

나는이 같은 유사 정의 된 포인트 컷의 요구되는 측면이 있습니다 이러한 측면 내부 그래서AspectJ를이 : @Aspect

@Around("pointcut1(request) || pointcut2(request) || pointcut3(request)") 
public ModelAndView myAspect(ProceedingJoinPoint proceedingJp, 
          HttpServletRequest request) 
{ 
    //do something. 
} 

을 나는 것을 알 필요가 어느 pointcut (pointcut1/2/3)이 myAspect가 호출되는지. 내가 이것을 어떤면에서 얻을 수있는 이유가 있습니까?

가 나는 @Aspect (방법)에서 얻을 수있는 모든 매개 변수가 없습니다 ..... 자세한 내용을 추가합니다. JoinPoint를 얻을 수는 있지만 잘 작동하지 않습니다. 이 같은 뭔가 매우 편리 할 것입니다 ....

@Around("pointcut1(request) || pointcut2(request) || pointcut3(request)") 
public ModelAndView myAspect(ProceedingJoinPoint proceedingJp, PointCut pc ,HttpServletRequest request){ 
if (pc.equals("pointcut1")) { 
    //do something. 
} 
if (pc.equals("pointcut2")) { 
    //do something. 
} 
// ... 

}

제안하십시오!

더 이상 제안하지 마세요 !!!

답변

1

이렇게하는 가장 좋은 방법은 각 구성 요소 pointcuts에 대한 조언을 작성하고 도달 지점이라는 플래그를 설정하는 것입니다. Aspect 우선 순위 (즉, 다른 조언을하기 전에 어떤 조언을 실행하는지) 때문에 구성 요소 조언이 어휘의 최종 주변 조언보다 위에 있는지 확인해야합니다. 그것은 다음과 같이 표시됩니다 여기에서 주목해야 할

boolean pointcut1Reached = false; 

ModelAndView around(HttpServletRequest request) : pointcut1(request) { 
    pointcut1Reached = true; 
    try { 
     proceed(request); 
    } finally { 
     pointcut1Reached = false; 
    } 
} 

// ... similar for other pointcuts 

@Around("pointcut1(request) || pointcut2(request) || pointcut3(request)") 
public ModelAndView myAspect(ProceedingJoinPoint proceedingJp, HttpServletRequest request){ 
    if (pointcut1Reached) { 
     //do something. 
    } 
    if (pointcut2Reached) { 
     //do something. 
    } 
    // ... 
} 

두 가지 : 당신의 프로그램이 다중 스레드 경우

  1. 는, 당신은 화면의 인스턴스가 적합한 지 확인해야하려고합니다.
  2. 필자는 주석 스타일에 개인적인 편견을 가지고 있기 때문에 코드 스타일 AspectJ 구문을 사용합니다. :

하는 멀티 스레드 코드의 문제를 방지하려면, 당신은 화면에 대한 인스턴스 모델을 지정할 수 있습니다. 위의

aspect MyAspect percflowbelow(execution (* * HttpServletRequest.something(..)) { ... } 

성명은 HttpServletRequest.something()를 호출 아래의 각 cflow는 인스턴스화 측면의 인스턴스가 될 것이라고 말했다. 애스펙트 중 하나가 애스펙트 내에서 도달되었지만 퍼크 플로우 아래에 있지 않으면, 어드바이스가 실행되지 않습니다.

유일한 속임수는 percflowbelow 안에 어떤 종류의 포인트 컷을 놓아야하는지 알아내는 것입니다. 모든 pointcuts를 포함하는 스택에 메소드 호출 방법이 있습니까?

일단 문제가 해결되면 멀티 스레딩에 대해 걱정할 필요가 없습니다.

+0

안녕하세요, Andrew, 의견을 보내 주셔서 감사합니다. 모양이 좋고 나를 위해 작동 할 것이지만 조금 무거워 보일 것입니다 (두 통의 조언이 있습니다). 그리고 여러분이 지적했듯이, 나는 멀티 스레딩을 처리해야합니다. @Aspect (메서드)에서 얻을 수있는 매개 변수가없는 것입니까? JoinPoint를 얻을 수는 있지만 잘 작동하지 않습니다. 이 같은 것이 매우 편리 할 것입니다. @Around ("pointcut1 (request) || pointcut2 (request) || pointcut3 (request)") public ModelAndView myAspect (ProceedingJoinPoint proceedingJp, PointCut pc, HttpServletRequest request) { – Girish

+0

코드 스타일 aspectj를 사용하면, 멀티 스레딩에 대해 걱정할 필요가 없습니다. 애스펙트에서 인스턴스화 모델을 지정할 수 있습니다. 방법을 보여주기 위해 질문을 편집 할 것입니다. –