【问题标题】:Is there a naming convention for @ComponentScan basePackageClasses? [closed]@ComponentScan basePackageClasses 有命名约定吗? [关闭]
【发布时间】:2015-01-31 00:04:03
【问题描述】:

Spring 的 @ComponentScan 提供了一个类型安全的 basePackageClasses 属性 - 使用起来似乎是一件好事,尤其是在我正在处理的项目中重命名包的情况并不少见。文档说:

考虑在每个包中创建一个特殊的无操作标记类或接口,除了被此属性引用之外没有其他用途。

...但没有提供关于此类名称的进一步指导。我想知道这方面是否有任何约定。 package-info.java 已经存在于所有包中(由 Checkstyle 强制执行) - 本来希望重用它,但遗憾的是 Java 不允许使用此名称的类。

(如果不存在这样的标准,我想可能是PackageInfoBasePackagePackageMarker 或类似标准,但如果有,我更愿意遵循约定。)

【问题讨论】:

  • 我觉得这是基于意见的。例如,我通常会将我的@Controller 类型存储在一个包中,因此我将在Controllers.java 中命名相应的类或接口Controllers
  • 同意这可能涉及意见,但希望有人能够指出我的标准或广泛使用的方法的证据。
  • 它很有用,因为它是类型安全的——指定了一个类而不是一个字符串,所以如果包名要改变也没关系。
  • 这似乎主要是意见,尽管您可以改写(也许要求最佳实践)。不过,我认为没有任何标准。
  • 好的,以为问题已经给出了要点,但稍微改写了最后一句并用括号括起来以使这一点更清楚。

标签: java spring dependency-injection convention component-scan


【解决方案1】:

还没有答案,必须做出决定,所以这里是:

标记类:

package com.companyname.appname.projectname.package1name;

/**
 * Empty marker class used to identify this package when using type-safe basePackageClasses in Spring @ComponentScan.
 */
public class PackageMarker {
    // Empty marker class
}

用法:

@ComponentScan(basePackageClasses = {
    com.companyname.appname.projectname.package1name.PackageMarker.class,
    com.companyname.appname.projectname.package2name.PackageMarker.class,
    /* ...etc... */
})

PackageMarker 命名理由:

  1. 似乎明智的做法是让所有此类类具有相同的名称,以便轻松识别。
  2. 以“Package”开头似乎是明智的(与 package-info.java 相同)。
  3. 以“Marker”结尾似乎是明智的,因为文档引用了“marker class”。
  4. 选择不包含“Base”一词,以免与基类混淆。
  5. 选择不包含“信息”一词,因为它不包含任何像 package-info.java 那样的信息。
  6. 选择不包含任何其他字词(例如“NoOp”),以使其在其他可能的用途中保持敏捷和灵活。

如果有人能给出在更具开创性的上下文中使用的标记类的示例,我仍然会感兴趣...

【讨论】:

  • 这种方法的一个缺点是使用非常冗长。
  • 它只是反映包结构,可以根据需要尽可能简洁或详细以保证唯一性。
  • 是的,但是您也可以为标记接口指定一个对您的项目唯一的名称,然后注释可以看起来像 @ComponentScan(basePackageClasses = {TwitterClient.class, EvernoteClient.class})
  • 每个人都有自己的想法,但不确定我是否会采用这种策略。标记类标识整个包,这将允许名称偏离包名。随着标记类数量的增加,以后可能会出现名称唯一性问题。
  • 我还将通过将 PackageMarker 类设为 final 并将其构造函数设为私有来防止实例化:public final class PackageMarker { private PackageMarker() { throw new AssertionError("Don't instantiate " + PackageMarker.class); } }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 2016-12-25
  • 2011-10-21
  • 2010-10-15
  • 2014-07-25
  • 2013-01-06
相关资源
最近更新 更多