Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @ComponentScan BasePackageClass是否有命名约定?_Java_Spring_Dependency Injection_Convention_Component Scan - Fatal编程技术网

Java @ComponentScan BasePackageClass是否有命名约定?

Java @ComponentScan BasePackageClass是否有命名约定?,java,spring,dependency-injection,convention,component-scan,Java,Spring,Dependency Injection,Convention,Component Scan,Spring的@ComponentScan提供了一个类型安全属性——这似乎是一个很好的使用方法,尤其是在我正在处理的项目中,重命名包并不少见。文件说: 考虑在每个包中创建一个特殊的无操作标记类或接口,该类或接口除了被该属性引用之外没有其他用途 。。。但对于此类课程的名称没有提供进一步的指导。我想知道这方面是否有什么惯例package info.java已经存在于所有包中(由Checkstyle强制执行)——本希望重用它,但遗憾的是java不允许使用这种名称的类 (如果没有这样的标准,我想可能是P

Spring的@ComponentScan提供了一个类型安全属性——这似乎是一个很好的使用方法,尤其是在我正在处理的项目中,重命名包并不少见。文件说:

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

。。。但对于此类课程的名称没有提供进一步的指导。我想知道这方面是否有什么惯例
package info.java
已经存在于所有包中(由Checkstyle强制执行)——本希望重用它,但遗憾的是java不允许使用这种名称的类


(如果没有这样的标准,我想可能是
PackageInfo
BasePackage
PackageMarker
或类似的标准,但如果有标准,我更愿意遵循惯例。)

还没有答案,必须做出决定,因此:

标记类:

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... */
})
用法:

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
命名对正:

  • 所有这样的类都有相同的名称,这样就可以很容易地识别它们,这似乎是明智的
  • 从“Package”(与Package info.java的方式相同)开始似乎是明智的
  • 以“Marker”结尾似乎是明智的,因为文档引用了一个“Marker类”
  • 选择不包含单词“Base”,这样就不会与基类混淆
  • 选择不包含单词“Info”,因为它不像package-Info.java那样包含任何信息
  • 选择不包含任何其他单词(如“NoOp”),以保持其简洁灵活,可用于其他可能的用途

  • 如果有人能给出在更具探索性的环境中使用的标记类的例子,我仍然会感兴趣…

    我觉得这是一种基于观点的观点。例如,我通常会将我的
    @Controller
    类型存储在一个包中,因此,我将在
    Controllers.java
    中命名相应的类或接口
    Controllers
    。我同意这可能涉及观点,但希望有人能向我指出标准或广泛使用的方法的证据。这很有用,因为它是类型安全的-指定了类而不是字符串,因此如果包名这似乎主要是观点,尽管你可以重新措辞(也许要求最佳实践)。但是我不认为有任何标准。好的,我认为问题已经给出了要点,但是稍微改写了最后一句,并将其括起来,以使其更清楚。这种方法的一个缺点是用法非常冗长。它只是反映了包的结构,可以根据需要简洁或详细地保证唯一性。是的,但是您也可以给标记接口一个项目唯一的名称,然后注释可以看起来像@ComponentScan(basePackageClasses={TwitterClient.class,EvernoteClient.class}),但我不确定是否会采用这种策略。marker类标识整个包,这将允许名称与包名称不同。随着标记类数量的增加,名称唯一性可能会出现问题。我还将通过使PackageMarker类为final及其构造函数为private来防止实例化它:
    public final class PackageMarker{private PackageMarker(){throw new assertioneror(“不要实例化”+PackageMarker.class);}}