Go to file
Sam Brannen 47f88e123f Invoke init/destroy/SpEL methods via public types whenever possible
Prior to this commit, when invoking init methods and destroy methods
for beans as well as methods within Spring Expression Language (SpEL)
expressions via reflection, we invoked them based on the "interface
method" returned from ClassUtils.getInterfaceMethodIfPossible(). That
works well for finding methods defined in an interface, but it does not
find public methods defined in a public superclass.

For example, in a SpEL expression it was previously impossible to
invoke toString() on a non-public type from a different module. This
could be seen when attempting to invoke toString() on an unmodifiable
list created by Collections.unmodifiableList(...). Doing so resulted in
an InaccessibleObjectException.

Although users can address that by adding an appropriate --add-opens
declaration, such as --add-opens java.base/java.util=ALL-UNNAMED, it is
better if applications do not have to add an --add-opens declaration
for such use cases in SpEL. The same applies to init methods and
destroy methods for beans.

This commit therefore introduces a new
getPubliclyAccessibleMethodIfPossible() method in ClassUtils which
serves as a replacement for getInterfaceMethodIfPossible().

This new method finds the first publicly accessible method in the
supplied method's type hierarchy that has a method signature equivalent
to the supplied method. If the supplied method is public and declared
in a public type, the supplied method will be returned. Otherwise, this
method recursively searches the class hierarchy and implemented
interfaces for an equivalent method that is public and declared in a
public type. If a publicly accessible equivalent method cannot be
found, the supplied method will be returned, indicating that no such
equivalent method exists.

All usage of getInterfaceMethodIfPossible() has been replaced with
getPubliclyAccessibleMethodIfPossible() in spring-beans and
spring-expression. In addition, getInterfaceMethodIfPossible() has been
marked as deprecated in favor of the new method.

As a bonus, the introduction of getPubliclyAccessibleMethodIfPossible()
allows us to delete a fair amount of obsolete code within the SpEL
infrastructure.

See gh-29857
Closes gh-33216
2024-08-22 14:35:21 +02:00
.github Merge branch '6.1.x' 2024-08-09 15:52:35 +02:00
buildSrc Disable class data sharing (CDS) for tests 2024-08-07 18:08:03 +03:00
framework-api
framework-bom
framework-docs Refer to the "Java Module System" instead of "Jigsaw" 2024-08-22 13:00:39 +02:00
framework-platform Upgrade to JUnit 5.11 2024-08-15 18:15:15 +02:00
gradle Merge branch '6.1.x' 2024-08-07 18:26:13 +03:00
integration-tests
spring-aop Merge branch '6.1.x' 2024-08-12 17:32:53 +02:00
spring-aspects Harmonize NoUniqueBeanDefinitionException message 2024-08-02 16:24:43 +02:00
spring-beans Invoke init/destroy/SpEL methods via public types whenever possible 2024-08-22 14:35:21 +02:00
spring-context Refer to the "Java Module System" instead of "Jigsaw" 2024-08-22 13:00:39 +02:00
spring-context-indexer
spring-context-support
spring-core Invoke init/destroy/SpEL methods via public types whenever possible 2024-08-22 14:35:21 +02:00
spring-core-test
spring-expression Invoke init/destroy/SpEL methods via public types whenever possible 2024-08-22 14:35:21 +02:00
spring-instrument
spring-jcl
spring-jdbc Use new features from JUnit Jupiter 5.11 2024-08-16 13:48:19 +02:00
spring-jms Use new features from JUnit Jupiter 5.11 2024-08-16 13:48:19 +02:00
spring-messaging Polishing in HTTP interface argument resolvers 2024-08-12 21:01:03 +03:00
spring-orm
spring-oxm
spring-r2dbc
spring-test Add missing @⁠TestMethodOrder declarations 2024-08-19 14:46:21 +02:00
spring-tx Enforce non-null value in requiredSingleResult/requiredUniqueResult 2024-08-05 15:53:17 +02:00
spring-web Merge branch '6.1.x' 2024-08-19 13:58:31 +02:00
spring-webflux Use new features from JUnit Jupiter 5.11 2024-08-16 13:48:19 +02:00
spring-webmvc Use new features from JUnit Jupiter 5.11 2024-08-16 13:48:19 +02:00
spring-websocket
src Merge branch '6.1.x' 2024-08-18 13:04:21 +02:00
.editorconfig
.gitattributes
.gitignore
.sdkmanrc Upgrade to Java 17.0.12 2024-08-04 09:34:13 +02:00
CONTRIBUTING.md
LICENSE.txt
README.md
SECURITY.md
build.gradle
gradle.properties Next development version (v6.1.13-SNAPSHOT) 2024-08-14 13:27:42 +02:00
gradlew
gradlew.bat
import-into-eclipse.md
import-into-idea.md
settings.gradle
update_copyright_headers.sh

README.md

Spring Framework Build Status Revved up by Develocity

This is the home of the Spring Framework: the foundation for all Spring projects. Collectively the Spring Framework and the family of Spring projects are often referred to simply as "Spring".

Spring provides everything required beyond the Java programming language for creating enterprise applications for a wide range of scenarios and architectures. Please read the Overview section of the reference documentation for a more complete introduction.

Code of Conduct

This project is governed by the Spring Code of Conduct. By participating, you are expected to uphold this code of conduct. Please report unacceptable behavior to spring-code-of-conduct@spring.io.

Access to Binaries

For access to artifacts or a distribution zip, see the Spring Framework Artifacts wiki page.

Documentation

The Spring Framework maintains reference documentation (published and source), GitHub wiki pages, and an API reference. There are also guides and tutorials across Spring projects.

Micro-Benchmarks

See the Micro-Benchmarks wiki page.

Build from Source

See the Build from Source wiki page and the CONTRIBUTING.md file.

Continuous Integration Builds

Information regarding CI builds can be found in the Spring Framework Concourse pipeline documentation.

Stay in Touch

Follow @SpringCentral, @SpringFramework, and its team members on 𝕏. In-depth articles can be found at The Spring Blog, and releases are announced via our releases feed.

License

The Spring Framework is released under version 2.0 of the Apache License.