我正在嘗試爲測量方法運行時創建計時器方面。外觀不適用於帶有外部罐子的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的自動的配置加載。
你也有春天方面依賴? –
我嘗試添加它,但它也不能正常工作:/ – Avi
爲什麼使用反射來獲取註釋?您可以簡單地將它添加到around通知方法的參數中並直接訪問它。 – sheltem