我有一个带有抽象方法的抽象类

@Asynchronous
public abstract void runAsync();

我在 Spring Async not working on controller's abstract super class method中找到了@Async的答案

问题是,如果我在实现中重写它,此方法runAsync是否会异步?还是仅在实现中需要做@Asynchronous批注?

最佳答案

注释是,默认情况下不继承。仅当注释定义中具有@Inherited属性时,注释才会被继承。现在来看@Async注释定义:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Async
Async注释不具有@Inherited属性,因此不会继承到子类。在这种情况下,您需要在子类重写方法中显式指定@Async使其起作用。有关更多信息,请访问link

编辑:javax.ejb.Asynchronous也没有@Inherited属性(docs)
@Target(value={METHOD,TYPE})
 @Retention(value=RUNTIME)
public @interface Asynchronous

因此,在@Asynchronous的情况下,用@Asynchronous覆盖方法的情况下的行为将与上述相同。

10-06 07:31