⭐ New Features
- Remove unnecessary
method.isAccessible()
invocation #32548 - Improve names of classes generated by the SpEL compiler #32497
- Refine null-safety with NullAway build-time checks #32475
- Consistent handling of undeclared checked exceptions in CGLIB proxies #32469
- Resolve property-dependent parameter names for exception messages #32462
- Consistent ErrorHandler support in TaskScheduler variants #32460
- Add CBOR support to
AllEncompassingFormHttpMessageConverter
#32428 - Reject
null
return value fromMethodReplacer
for primitive return type #32412 - Make SpEL's
OptimalPropertyAccessor
private #32410 - NPE when using
pathExtension
predicate for routes that have no file extensions #32404 - Use
Map#computeIfAbsent
in SpEL support classes #32385 - Use
ELContext
instead of deprecatedVariableResolver
API inJspPropertyAccessor
#32383 - Add web support for YAML via Jackson #32345
- Add DataSource configuration/exposure to LocalEntityManagerFactoryBean #32344
ServletResponseHttpHeaders
ignores content type inServletResponse
#32339- Use
ConcurrentHashMap.newKeySet
where feasible #32294 - Avoid resizing of fixed-size
HashSet
/LinkedHashSet
variants #32291 - Support backticks for quoted identifiers in
spring-r2dbc
#32285 - Avoid internal lifecycle synchronization for
SingleConnectionFactory
andSingleConnectionDataSource
#32284 - DefaultMessageListenerContainer should be able to scale down using default config #32260
- Revise DefaultMessageListenerContainer for first-class virtual thread support #32252
- Optimize Request Predicate attribute merging #32245
- Add ThreadLocalAccessor for LocaleContext and RequestAttributes #32243
- Avoid ASYNC dispatch if possible in DefaultAsyncServerResponse #32223
- Deprecate LobHandler and SqlXmlHandler abstractions (including SqlLobValue and related support classes) #32179
- Revisit default lifecycle phases and timeouts (e.g. for ThreadPoolTaskScheduler) #32152
- Harmonize ChannelRegistration to use Executor rather than TaskExecutor #32129
- Deprecate HttpHeaders.writableHttpHeaders #32116
- JsonPathAssertions methods that take a type used as a lambda should be ordered consistently #32062
- Deprecate local variable support in SpEL's internal
ExpressionState
#32004 - Support sending large STOMP messages as fragmented frames on
WebSocketStompClient
#31970 - NamedParameterJdbcTemplate does not support backticks for quoted identifiers #31944
- Use UTF-8 by default for JSON multipart content in
ContentRequestMatchers
#31924 - Add interception of RFC-7807 responses #31822
- Provide more control over charset parameter when writing form data #31781
- Enhance WebTestClient to support JSONPath decoding to higher level objects #31653
- Enhance JsonPathExpectationsHelper to allow use of JSONPath Configuration #31651
- Support "--" end of options in SimpleCommandLineArgsParser #31513
- Make use of bean definition overriding more visible #31288
- Initial support for Servlet 6.1 #31159
- Initial support for JPA 3.2 #31157
- Support to propagate a savepoint operation via TransactionSynchronization #30509
- Resolve type variable recursively in
GenericTypeResolver
#30079 - Propagate WebClient attributes into underlying HTTP client request where possible #29958
- Provide a safe way to override and mock beans in the TestContext framework #29917
- Invoke methods via public interface/superclass in compiled SpEL expressions #29857
- Introduce null-safe index operator in SpEL #29847
@Valid
annotation can't establish dependency relationship between beans #29730- Optimize constructor dependency injection performance for parameter name matches #28122
- Efficient webjars version resolution natively in Spring #27619
- Throw Exception when two primary beans are present in one factory #26612
- Allow creation of Beans that cannot be autowired by type unless qualified #26528
- Introduce
IndexAccessor
SPI to customize the SpELIndexer
#26478 - Introduce support for non-
@Primary
fallback beans #26241 - Optimize ConfigurationClassPostProcessor#enhanceConfigurationClasses method to shorten startup time #25738
- Inherited
@Transactional
methods should be able to use class-level TransactionManager qualifier from concrete class #24291 - TaskScheduler does not work with TaskDecorator #23755
- Synchronization during singleton creation may result in deadlock #23501
- Allow global default for
@Transactional
rollback behavior on checked exceptions #23473 - Add support for resolving multiple bounds in type variables #22902
@Transactional
annotation can't establish dependency relationship between beans #22526- Asynchronous EntityManagerFactory bootstrapping to complete on context refresh completion [SPR-17334] #21868
- Provide a mechanism to be notified that a bean has been created [SPR-16822] #21362
- Reduce the effect of different base package configuration on component scanning performance and make the effect more intuitive [SPR-16649] #21190
- Support AssertJ variant in MockMvc [SPR-16637] #21178
- Support configuration of connection URL via EmbeddedDatabaseBuilder [SPR-16619] #21160
- Revisit storage of null attributes in AbstractFallbackTransaction/CacheAttributeSource [SPR-15513] #20072
- Asynchronous initialization of beans during startup [SPR-14920] #19487
- Autowiring with
@Autowired
/@Inject
get much slower than with@Resource
as the number of classes increases [SPR-13086] #17677 - Parallel bean initialization during startup [SPR-8767] #13410
- Support escaping prefix and separator in property placeholders [SPR-4953] #9628
🐞 Bug Fixes
- Transactional event listener invoked like standard event listener if
@EnableTransactionManagement
not active #32319 - Stop overriding thread name prefix for externally configured Executor in ChannelRegistration #32132
- WebClient and RestClient's defaultRequest(..) is not invoked early enough #32053
- Alias resolution in
SimpleAliasRegistry
depends on hash codes of alias values #32024 - Fix
DefaultDataBuffer#getNativeBuffer()
to set correct limit #32009 - DefaultDataBuffer#setNativeBuffer violates contract of DataBuffer #30984
- The method getNativeBuffer() in DefaultDataBuffer returns misconfigured ByteBuffer #30967
- ApplicationContext caches are not cleared as expected when beans are lazy initialized #30954
- A configuration class superclass that is skipped due to register bean phase conditions is ignored when another configuration class that extends it is processed #28676
- Configuration class parsing registers bean in parent class if overridden
@Bean
method defines an alternative name #28286 - Conditions to determine if
@ComponentScan
should be applied can be chosen from the wrong class #27077 - Fallback with placeholder is evaluated even if the fallback is not required #26268
- Name of scanned
@Configuration
class affects@Import
to work or fail #24643 - Reject conditional
@ComponentScan
declarations that rely on the REGISTER_BEAN phase #23206 - Initialization blocked by multi-threaded event publishing [SPR-16357] #20904
- Invalid instance injected for generic type in case of partial type variable [SPR-16179] #20727
📔 Documentation
- Polish Bean Overriding in Tests section of the reference guide #32411
- Improve Javadoc for
substituteNamedParameters()
inNamedParameterUtils
regarding empty lists #32380 StringUtils.uriDecode
decodes strings with non-ASCII characters incorrectly #32360- Improve documentation for SpEL indexing support #32355
- Document when the JPA infrastructure is ready for use #26153
- Refactor configuration code samples to be more relevant for modern Spring applications #22171
🔨 Dependency Upgrades
- Upgrade to HtmlUnit 3.11.0 #30392
- Upgrade to Micrometer 1.13.0-RC1 #32595
- Upgrade to Reactor 2024.0.0-M1 #32591
❤️ Contributors
Thank you to all the contributors who worked on this release:
@FelixDes, @Flamme1004K, @LeMikaelF, @PhilKes, @Trympyrym, @ZeroCyan, @alidandach, @andrea-mauro, @azdanov, @deejay1, @injae-kim, @izeye, @jackmiking, @kilink, @nullzl, @quaff, @ttddyy, and @yuhangbin