是否有@ComponentScan basePackageClasses的命名约定?

Ste*_*ers 13 java convention spring dependency-injection component-scan

Spring的@ComponentScan提供了一个类型安全的basePackageClasses属性 - 这似乎是一件好事,特别是因为在我正在处理的项目中重命名包这种情况并不少见.文件说:

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

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

(如果不存在上述标准在想或许PackageInfo,BasePackage,PackageMarker或类似,但宁愿遵循惯例,如果有一个.)

Ste*_*ers 10

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

标记类:

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
}
Run Code Online (Sandbox Code Playgroud)

用法:

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

PackageMarker 命名理由:

  1. 似乎所有这些类具有相同的名称是合理的,因此可以很容易地识别它们.
  2. 从"Package"开始(与package-info.java相同)似乎是明智的.
  3. 由于文档指的是"标记类",因此以"Marker"结尾似乎是明智的.
  4. 选择不包括"Base"这个词,所以它不会与基类混淆.
  5. 选择不包含单词"Info",因为它不包含package-info.java之类的任何信息.
  6. 选择不包括任何其他词语(例如"NoOp")以保持其活泼和灵活用于其他可能的用途.

如果有人能提供在更加开拓性的环境中使用的标记类的例子,那么仍然会感兴趣...

  • 我还会通过使其成为final并且其构造函数为private来阻止PackageMarker类的实例化:`public final class PackageMarker {private PackageMarker(){throw new AssertionError("Do not instantiate"+ PackageMarker.class); } (3认同)