2016-08-14 58 views
7

我正在嘗試爲測量方法運行時創建計時器方面。外觀不適用於帶有外部罐子的Spring引導應用程序

我創建名爲@Timer註釋:

@Retention(RetentionPolicy.RUNTIME) 
@Target(value = {ElementType.METHOD, ElementType.TYPE}) 
public @interface Timer { 
    String value(); 
} 

然後我創建的方面如下:

@Aspect 
public class MetricAspect { 

    @Autowired 
    private MetricsFactory metricsFactory; 

    @Pointcut("@annotation(my.package.Timer)") 
    public void timerPointcut() {} 

    @Around("timerPointcut() ") 
    public Object measure(ProceedingJoinPoint joinPoint) throws Throwable { 
     /* Aspect logic here */ 
    } 

    private Timer getClassAnnotation(MethodSignature methodSignature) { 
     Timer annotation; 
     Class<?> clazz = methodSignature.getDeclaringType(); 
     annotation = clazz.getAnnotation(Timer.class); 
     return annotation; 
    } 

我有一個配置類,如下所示:

@Configuration 
@EnableAspectJAutoProxy 
public class MetricsConfiguration { 

    @Bean 
    public MetricAspect notifyAspect() { 
     return new MetricAspect(); 
    } 
} 

一切都在這裏被定義在一個包裝的罐子裏我用作我的彈簧引導應用程序的依賴項

在我的彈簧引導應用程序中,導入MetricsConfiguration,我調試了代碼並看到創建了MetricAspect bean。

我使用的代碼如下:

@Service 
public class MyService { 
    ... 

    @Timer("mymetric") 
    public void foo() { 
     // Some code here... 
    } 

    ... 
} 

但我的代碼沒有達到到measure方法。不知道我錯過了什麼。

爲了完成圖片,我有這些依賴於我的POM文件中加入:

<dependencies> 
    <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjweaver</artifactId> 
     <version>1.7.4</version> 
    </dependency> 

    <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjrt</artifactId> 
     <version>1.7.4</version> 
    </dependency> 
</dependencies> 

這就是@Configuration類進口MetricsConfiguration

@Configuration 
@EnableAspectJAutoProxy 
@Import(MetricsConfiguration.class) 
@PropertySource("classpath:application.properties") 
public class ApplicationConfiguration { 

} 

它的滿載Spring的自動的配置加載。

+0

你也有春天方面依賴? –

+0

我嘗試添加它,但它也不能正常工作:/ – Avi

+0

爲什麼使用反射來獲取註釋?您可以簡單地將它添加到around通知方法的參數中並直接訪問它。 – sheltem

回答

4

可以@Component@Configurable解決你的問題?

@Aspect 
@Component 
public class yourAspect { 
... 
} 

Enable Spring AOP or AspectJ

編輯:

我創建了一個項目,以模擬您的問題,似乎沒有什麼問題畢竟。是否受到其他問題的影響?

https://github.com/zerg000000/spring-aspectj-test

+0

https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-aop官方示例如何在spring boot中使用AspectJ –

+0

感謝您的回答Albert 。這不是'@ Component'問題。我嘗試了它的要點,但無論如何我都在'MetricsConfiguration'中創建了bean。這不是問題。我懷疑這是因爲外觀和bean都在外部jar中,而我正在使用spring引導。 – Avi

1

我無法重現使用的AspectJ 1.8.8春天4.2.5您的問題。 Here是我的maven多模塊方法,使用單獨的jar包。

我稍微修改了您的代碼,但沒有更改任何註釋。這可能是不同的唯一的事情是,我已經添加org.springframework:spring-aop依賴和定義我的入口點如下:

@Import(MetricsConfiguration.class) 
@SpringBootApplication 
public class Application { 
    // @Bean definitions here // 

    public static void main(String[] args) throws InterruptedException { 
     ApplicationContext ctx = 
      SpringApplication.run(Application.class, args); 
     ctx.getBean(MyService.class).doWork(); 
    } 
} 
+0

感謝您的詳盡解答。我仍然沒有發現我的代碼和你的代碼沒有區別。我的猜測是,這與Spring會自動加載一個'@ Configuration'類(實際上是多個)並且丟失一些東西有關。我會繼續挖掘。 – Avi

+0

@Avi是否可以顯示如何在應用程序中導入「MetricsConfiguration」?它與我的例子有什麼不同嗎? – vsminkov

+0

是的,我更新了問題 - 最後添加了它。 – Avi