@ComponentScan basePackageClasses 是否有命名规范?

15
Spring的@ComponentScan提供了一个类型安全的basePackageClasses属性,这似乎是一个很好的选择,特别是在我正在工作的项目中,包经常被重命名。文档说:
考虑在每个包中创建一个特殊的无操作标记类或接口,它除了被此属性引用外没有任何其他目的。
...但是关于这种类的名称,它没有提供进一步的指导。想知道是否有任何约定。所有包中都已经存在package-info.java(由Checkstyle强制执行)- 我本来希望重用它,但遗憾的是Java不允许使用这个名称的类。
(如果不存在这样的标准,我想也许可以考虑使用PackageInfo, BasePackage, PackageMarker或类似的名称,但如果有约定的话,我更愿意遵循它。)

2
我觉得这有点基于个人看法。例如,我通常会将我的@Controller类型存储在一个包中,因此我会将相应的类或接口命名为ControllersControllers.java中。 - Sotirios Delimanolis
3
同意这可能涉及观点,但希望有人能够指引我寻找标准或广泛使用的方法的证据。 - Steve Chambers
basePackageClasses参数只需要类名还是完全限定名?如果是后者,它与basePackages相比并没有更多的用处。 - guido
2
它很有用,因为它是类型安全的 - 指定了一个类而不是一个字符串,因此如果包名称更改,它也不会受到影响。 - Steve Chambers
1
这似乎主要是个人观点,但你可以重新表述(也许询问最佳实践)。我认为没有任何标准。 - chrylis -cautiouslyoptimistic-
1
好的,我认为问题已经表达出来了,但是我稍微重新措辞并加上括号,以便更清楚地表达。 - Steve Chambers
1个回答

16

目前还没有答案,我不得不做出决定,所以在这里:

标记类:

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. 选择不包括 "Info" 这个词,因为它不像 package-info.java 一样包含任何信息。
  6. 选择不包括任何其他单词(例如 "NoOp"),以便保持简洁并对其他可能的用途具有灵活性。

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


这种方法的一个缺点是使用非常冗长。 - Bogdan Calmac
这只是反映包结构,可以尽可能地简洁或冗长,以确保唯一性。 - Steve Chambers
1
是的,但您也可以为标记接口命名一个在项目中唯一的名称,然后注释看起来像 @ComponentScan(basePackageClasses = {TwitterClient.class, EvernoteClient.class})。 - Bogdan Calmac
1
每个人都有自己的选择,但我不确定我会采用这种策略。标记类标识整个包,这将允许名称与包名称偏离。随着标记类数量的增加,以后可能会出现名称唯一性问题。 - Steve Chambers
4
我会将PackageMarker类设为final并使其构造函数私有化,以防止它被实例化:public final class PackageMarker { private PackageMarker() { throw new AssertionError("Don't instantiate " + PackageMarker.class); } } - Arend v. Reinersdorff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接