Skip to content

Inclusion of overloaded in equals() and hashCode() for MethodOverride breaks equals() in AbstractBeanDefinition [SPR-11420] #16047

@spring-projects-issues

Description

@spring-projects-issues

Sam Brannen opened SPR-11420 and commented

Status Quo

The overloaded flag in MethodOverride is a mutable property that is only intended to be used "to optimize runtime performance" (from the Javadoc), specifically limited to the implementation of ReplaceOverride.matches().

The overloaded flag is, however, currently used to determine equality of and calculate hash codes for MethodOverride instances.

Its value is potentially changed from true (the default) to false in AbstractBeanDefinition.validate(). As a consequence, given two bean definitions A and B that represent the exact same bean definition metadata for a bean that relies on method injection (perhaps loaded via separate application contexts in the same VM), if A has been validated and B has not, then A.equals(B) will potentially return false, which is not acceptable behavior.

Note that AbstractBeanDefinition.equals() includes an equality check for MethodOverrides.

Deliverables

  1. Stop including the overloaded flag in equals() and hashCode() for MethodOverride.

Affects: 3.0 GA

Issue Links:

Backported to: 3.2.8

Metadata

Metadata

Assignees

Labels

in: coreIssues in core modules (aop, beans, core, context, expression)status: backportedAn issue that has been backported to maintenance branchestype: bugA general bug

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions