方面不适用于带有外部jar的Spring启动应用程序

2022-09-02 21:32:52

我正在尝试创建一个计时器方面来测量方法运行时间。

我创建了一个名为:@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();
    }
}

到目前为止的所有内容都在一个打包的jar中定义,我将其用作春季启动应用程序中的依赖项

在我的 spring boot 应用程序中,我导入了 ,并调试了代码,并看到 Bean 已创建。MetricsConfigurationMetricAspect

我在代码中使用它,如下所示:

@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>

这是导入的类:@ConfigurationMetricsConfiguration

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

}

它加载了Spring的自动配置加载。


答案 1

可以或解决您的问题?@Component@Configurable

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

启用弹簧 AOP 或 AspectJ

编辑:

我创建了一个项目来模拟您的问题,似乎毕竟没有问题。是否受其他问题影响?

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


答案 2

我无法使用aspectJ 1.8.8spring 4.2.5重现您的问题。这是我的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();
    }
}

推荐