当前位置: 首页 > 知识库问答 >
问题:

是否可以使用自定义注释进行此操作?

夏弘文
2023-03-14

这是我的代码(简单但有效),它是一个计算引擎,通过按特定顺序应用规则进行试验:

class Rule1 implements IRule{
    doSomethingMethod () {}
}

class Rule2 implements IRule{
    doSomethingMethod () {}
}
...

class Engine1 () {
    Rule1.doSomething();
    Rule2.doSomething();
}

class Engine2 () {
    Rule3.doSomething();
    Rule99.doSomething();
    Rule5.doSomething();
}

我想用自定义注释对此进行编码,因为我的目标是统计哪些引擎调用哪些规则,我认为这会更容易:

public @Interface Rule (){
    class Rule rule;
}

class Engine1 () {
    @Rule(Rule1.class);
    @Rule(Rule2.class);
}

class Engine2 () {
    @Rule(Rule3.class);
    @Rule(Rule99.class);
    @Rule(Rule5.class);
}

然后我可以用org扫描。springframework。上下文注释。ClassPathScanningCandidateCom使统计更容易。

这可能吗(怎么可能?)?这是好办法吗?我还有别的办法吗?

共有1个答案

羊禄
2023-03-14

是的,有可能。

您可以定义规则注释

  @Target(ElementType.TYPE)
  @Retention(RetentionPolicy.RUNTIME)
  public @interface Rule {
    Class<? extends IRule>[] rule();
  }

并在您的EngineeX类中使用它们

  @Rule(rule = { Rule1.class, Rule2.class })
  public static class Enginee1 {
  }

  @Rule(rule = { Rule2.class, Rule3.class })
  public static class Enginee2 {
  }

然后我们扫描类以查找是否有@规则。如果是,则加载它们。

public static void load(Class<?> engineeClass) {
  Rule rule = engineeClass.getAnnotation(Rule.class);
  if (rule != null) {
    for (Class<? extends IRule> clz : rule.rule()) {
      try {
        IRule r = clz.newInstance();
        r.run();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
}

如果您希望它们像静态块一样自动加载。有几种方法。

  1. 在每个EngineeX上添加静态块加载(EngineeX.class)
 类似资料:
  • 我们正在尝试在Spring中为我们的rest api创建一个自定义注释。我是创建自定义注释的新手,我已经给出了下面的代码片段 Spring Boot应用程序-- RestController- 自定义注释-- 注解处理器 方法回调-- 我试图处理自定义注释在一个类中实现BeanPost处理器,但我有一个问题 Issue_1:回调被调用一次,但是我不能对 /service/v1/version应用编

  • 问题内容: 我有一些需要经常打印的结构。现在,我正在围绕该结构使用经典的打印包装器: 此功能很方便,但实际上也很有限。如果不进行新包装,则无法添加或添加一些文本。我知道我可以使用 va_arg 系列添加或添加一些文本,但是我觉得我会重新实现。 我想知道是否有可能向printf编写自定义函数。我希望能够写这样的东西: 这可能吗 ?我怎样才能做到这一点 ? 注意:我在Ubuntu Linux 10.0

  • 我发现了几个与此相关的(不是重复的)问题,但它们不能让我满意。 我无法理解在哪里以及为什么要使用? 我在一本书中读到了一个自定义注释的示例,但没有详细解释。 myMeth()内的输出与预期一致。 关于这个例子,我有几个问题。 1-如何在此程序中使用和?或

  • 本文向大家介绍使用Spring组合自定义的注释 mscharhag操作,包括了使用Spring组合自定义的注释 mscharhag操作的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将介绍一个非常有用的Spring功能,该功能允许我们基于一个或多个Spring注释创建自己的注释。 假设我们有一组经常一起使用的Spring注释。一个常见的示例是@Service和@Transactional的

  • 是否可以像在服务器端所做的那样,向ResteasyClient(代理框架)注册DynamicFeature? 所以类似这样的东西: 其中MyDynamicFeature实现 下面的一些文章似乎解释了一些非常相似的事情,但这似乎不适用于ClientResponseFilter/ResteAsyClient: 通过Resteasy上的NameBinding匹配特定方法的筛选器 Resteasy 3.x

  • 我正在尝试使用Spring安全注释,如@PreAuthorize和@安全,但我希望评估用户不是在一个角色上,而是他们是否拥有对特定实体的权限,在这种情况下是一家公司。在我的控制器中,我收到一个超文本传输协议请求,其中包含一个firmId作为参数,我想确保这个用户被允许进入这家公司。是否可以使用当前的Spring安全注释?。我正在寻找一个优雅的解决方案,我一直在寻找自定义约束验证器作为jsr303规