[英]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.