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

时间:2014-12-02 16:43:30

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

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

  

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

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

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

1 个答案:

答案 0 :(得分:9)

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

标记类:

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. 似乎明智的开始于&#34; Package&#34; (与package-info.java相同)。
  3. 似乎明智地以#34; Marker&#34;结束。因为文档引用了&#34;标记类&#34;。
  4. 选择不包括&#34; Base&#34;所以它与基类没有混淆。
  5. 选择不包括“#34; Info&#34;因为它不包含像package-info.java那样的任何信息。
  6. 选择不包含任何其他字词(例如&#34; NoOp&#34;),以保持其灵活,灵活用于其他可能的用途。
  7. 如果有人能够提供在更加开拓性的背景中使用的标记类的例子,那么仍然会感兴趣...