繁体   English   中英

继承Java接口的注释

[英]Inheriting the annotations of an interface in Java

我遇到的情况是,我希望所有实现特定接口的类也继承该类的注释以及方法。

@Component
public interface ITask {
    @Scheduled(fixedRate = 5000)
    void execute();
}

public class TaskOne implements ITask {
    private static Logger LOGGER = LoggerFactory.getLogger(TaskOne.class);
    @Override
    public void execute() {
        LOGGER.info("Hello from task one");
    }
}

public class TaskTwo implements ITask {
    private static Logger LOGGER = LoggerFactory.getLogger(TaskTwo.class);
    @Override
    public void execute() {
        LOGGER.info("Hello from task two");
    }
}

因此,我希望将这两个任务都视为一个bean,因为它们正在实现的接口是bean。 另外,我希望这两个任务的execute()方法每5秒安排一次。 我已经在包含main()方法的主Application类中使用了@EnableScheduling注释。

相反,我必须这样做以使其定期执行:

public interface ITask {
    void execute();
}

@Component
public class TaskOne implements ITask {
    private static Logger LOGGER = LoggerFactory.getLogger(TaskOne.class);
    @Override
    @Scheduled(fixedRate = 5000)
    public void execute() {
        LOGGER.info("Hello from task one");
    }
}

@Component
public class TaskTwo implements ITask {
    private static Logger LOGGER = LoggerFactory.getLogger(TaskTwo.class);
    @Override
    @Scheduled(fixedRate = 5000)
    public void execute() {
        LOGGER.info("Hello from task two");
    }
}

我不想使用此@Component注释和每个计划方法的@Scheduled注释对每个任务进行注释。 我希望为@Scheduled提供一些默认值,并且可以通过实现某个接口来处理@Component批注。

Java是否可能?

对于Java,这是不可能的。

您必须分别注释不同的类。

但是,如果要讨论的是自定义注释,则可以用@Inherited标记注释,并将其放在基类上,并使所有其他类扩展基类。

无论如何,您不能使用@Inherited注释@Component@Scheduled ,因此在这种使用情况下,此解决方案将无法工作。

为什么不允许这样做(来自此处的另一个答案):

我要说的原因是,否则会发生多重继承问题。

例:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD) @Inherited
public @interface Baz { String value(); }

public interface Foo{
    @Baz("baz") void doStuff();
}

public interface Bar{
    @Baz("phleem") void doStuff();
}

public class Flipp{
    @Baz("flopp") public void doStuff(){}
}

public class MyClass extends Flipp implements Foo, Bar{}

如果我这样做:

MyClass.class.getMethod("doStuff").getAnnotation(Baz.class).value()

结果将是什么? 'baz','phleem'或'flopp'?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM