2016-05-20 20 views
1

我試圖攔截包含在他們的包名的特定詞的所有類的包的方法......東西如下:@AspectJ切入點的執行包含關鍵字服務

@Pointcut("execution(* *..service..*.*(..))") 

我都在包中的類攔截:

com.domain.model.user.service.save(User user); 
com.domain.model.user.service.impl.save(XPTO xpto); 
com.domain.model.foo.service.HelloWorld.getMessage(Foo foo); 

總之,我想攔截所有的類屬於

package *service* 
方法210

我想從過去的許多天裏得到這個工作。

+0

如果它匹配包文件夾_named_'service'或包文件夾_containing_'service'太(像'com.test.fooservice1.Type')? –

+0

@NándorElődFekete我想使它成爲一個庫,以便它可以掃描客戶端的所有軟件包並攔截包含關鍵字「service」的客戶端軟件包 – Prathiba530

+0

@NándorElődFekete關鍵字「service」可以在像com .domain.test。service.Type(..)'和'com.test.service.impl.HelloWorld(..)' – Prathiba530

回答

0

試試這個。也許你必須排除你的方面類以避免無限循環。這個例子捕捉所有方法與com..login .. *封裝

@Aspect 
@SuppressAjWarnings({ "adviceDidNotMatch" }) 
public class AllMethodsAspect { 
    private static Map<String, Long> beforeTimestamps = new HashMap<>(); 

    @Pointcut("!within(aspects..*)" 
        + " && (!execution(* org..*   (..))  && !within(org..*)   && !call(* org..*   (..)))" 
        + " && (!execution(* java..*   (..))  && !within(java..*)   && !call(* java..*  (..)))" 
        + " && (!execution(* javax..*   (..))  && !within(javax..*)   && !call(* javax..*  (..)))" 
        + " && (!execution(* sun..*   (..))  && !within(sun..*)   && !call(* sun..*   (..)))" 
        + " && execution(* com..login..*(..))") 
    public void methodCall() { 
    } 

    @Before("methodCall()") 
    public void before(JoinPoint joinPoint) { 
     beforeMethodCall(joinPoint); 
    } 

    @AfterReturning(pointcut = "methodCall()", returning = "returnObject") 
    public void after(JoinPoint joinPoint, Object returnObject) { 
     afterMethodCall(joinPoint, returnObject); 
    } 

    @AfterThrowing(pointcut = "methodCall()", throwing = "throwable") 
    public void throwing(JoinPoint joinPoint, Throwable throwable) { 
     afterThrowingMethodCall(joinPoint, throwable); 
    } 

    void beforeMethodCall(JoinPoint joinPoint) { 
     try { 
      long start = System.currentTimeMillis(); 
      beforeTimestamps.put(joinPoint.toString() + " - " + Thread.currentThread().getName(), Long.valueOf(start)); 
      LOG.info(".before " + joinPoint); 
     } catch (Exception e) { 
      LOG.error(".before Exception " + e); 
     } 
    } 

    void afterMethodCall(JoinPoint joinPoint, Object returnObject) { 
     afterMethodCall(joinPoint, returnObject, 0); 
    } 

    void afterMethodCall(JoinPoint joinPoint, Object returnObject, int depth) { 
     try { 
      long start = beforeTimestamps.get(joinPoint.toString() + " - " + Thread.currentThread().getName()).longValue(); 
      beforeTimestamps.remove(joinPoint.toString() + " - " + Thread.currentThread().getName()); 

      long duration = System.currentTimeMillis() - start; 
      Signature signature = joinPoint.getSignature(); 
      if (signature instanceof MethodSignature) { 
       Class<?> returnType = ((MethodSignature) signature).getReturnType(); 
       LOG.info(".after " + joinPoint + " " + duration + "ms" + (void.class == returnType ? "" : " [" + returnObject + "]")); 
      } else if (signature instanceof ConstructorSignature) { 
       LOG.info(".after " + joinPoint + " " + duration + "ms Constructor"); 
      } else if (signature instanceof FieldSignature) { 
       LOG.info(".after " + joinPoint + " " + duration + "ms Field"); 
      } else { 
       LOG.info(".after " + joinPoint + " " + duration + "ms unknown"); 
      } 
     } catch (Exception e) { 
      LOG.error(".after Exception " + e); 
     } 
    } 

    void afterThrowingMethodCall(JoinPoint joinPoint, Throwable throwable) { 
     try { 
      Long startAsLong = beforeTimestamps.get(joinPoint.toString() + " - " + Thread.currentThread().getName()); 
      long start = startAsLong == null ? 0 : startAsLong.longValue(); 
      beforeTimestamps.remove(joinPoint.toString() + " - " + Thread.currentThread().getName()); 

      long duration = System.currentTimeMillis() - start; 
      LOG.info(".fail " + joinPoint.toString() + " " + duration + " ms - " + throwable.getMessage()); 
     } catch (NullPointerException e) { 
      LOG.info(".fail NullPointerException " + "unknown - " + throwable.getMessage()); 
     } 
    } 

    static final class LOG { 
     static void info(String loggingData) { 
      System.err.println(new Date() + " " + loggingData); 
     } 

     static void error(String loggingData) { 
      System.err.println(new Date() + " " + loggingData); 
     } 
    } 
} 
0

我認爲你可以捕捉你需要這樣的切入點是什麼:

before(): execution(* *(..)) && 
      (within(*..service..*.*) || within(service..*.*) || within(*..service.*)) {} 

這三個條款中捕捉三替代方案:

  • within(*..service..*.*):「服務」是在開始或結束
  • 某處包的名稱,但不:「服務」,在包裝名稱的開始(這也許不能在您的情況發生)
  • within(*..service.*)):「服務」,在包裝名稱

結束如果您需要捕捉serviceFoo變種可以添加圍繞服務進一步通配符(我認爲):within(*..*service*.*)

0

你應該使用一個切入點表達式是這樣的:

within(your.base.package..service..*) 
  • 限制到至少您的基本包(通常這不是一個問題)
  • 匹配「服務」在你的包名稱在任何級別

例如關鍵字,這將匹配這些類:

  • your.base.package.service.ServiceClass
  • your.base.package.service.customer.ServiceClass
  • your.base.package.internal.service.ServiceClass
  • your.base.package.internal.service.customer.ServiceClass