14

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

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

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

(如果不存在这样的标准,我可能会考虑PackageInfo,或类似的标准BasePackagePackageMarker但如果有的话,更愿意遵循约定。)

4

1 回答 1

13

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

标记类:

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. 由于文档引用了“标记类”,因此以“标记”结尾似乎是明智的。
  4. 选择不包含“Base”一词,因此它不会与基类混淆。
  5. 选择不包含“信息”一词,因为它不包含任何像 package-info.java 那样的信息。
  6. 选择不包含任何其他词(例如“NoOp”),以保持其敏捷性和灵活性以用于其他可能的用途。

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

于 2014-12-03T09:14:07.800 回答