现在,我的理解是,@RequestMapping 方法需要公开。它们也可以是私有的吗?如果是这样,我们什么时候会使用它?
我问这个问题的原因是我注意到 @RequestMapping 也适用于私有方法。为什么会这样?
是不是因为 spring 通过反射访问这些方法,所以没有真正考虑访问修饰符?这是一个错误还是一个有用的功能?
现在,如果不深入 Spring 开发人员的头脑,很难说出真正的原因(如果存在的话),因为这是很久以前实现的。
我猜想这是一个疏忽,因为使用私有方法作为请求映射的目标并没有显着的优势。当然,您不能再从其他代码中调用它们,但如果您从代码中调用控制器方法,那么您遇到的所有问题都是罪有应得。
此链接描述了一个有趣的情况,其中请求映射适用于包私有方法,但由于 AOP 仅适用于公共方法,因此结果是混乱和破坏。还有 4(四!) 个地方可以应用修复程序来防止非公共方法成为
@RequestMapping
的目标。
所以我将其归类为(小)错误。现在程序员要保持警惕并记住将这些方法公开。我会看看是否可以找到现有的错误通知单。
这确实按照设计工作。我们通常不会限制反射方法的可见性声明,将选择权留给开发人员。也就是说,对于这种特殊情况,我建议使用公共声明或潜在的包可见声明(没有可见性关键字),而私有处理程序方法实际上在这里更具利基效果。
多年后:
私有但带注释的方法的一个视角如下:
公共方法的返回值类型、参数类型(以及抛出的异常类型)也应该是公共的。如果您不希望参数和返回值是公共的(在 java 成员可见性意义上),私有方法是表达这一点的一种方式。