Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: spring-projects/spring-framework
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: v6.1.17
Choose a base ref
...
head repository: spring-projects/spring-framework
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: v6.1.18
Choose a head ref
  • 15 commits
  • 24 files changed
  • 4 contributors

Commits on Feb 13, 2025

  1. Verified

    This commit was signed with the committer’s verified signature.
    jmikola Jeremy Mikola
    Copy the full SHA
    ecd943c View commit details

Commits on Feb 18, 2025

  1. Mark XML-configured executor/scheduler as infrastructure bean

    Closes gh-34015
    
    (cherry picked from commit d0ceefe)
    jhoeller committed Feb 18, 2025

    Verified

    This commit was signed with the committer’s verified signature.
    jmikola Jeremy Mikola
    Copy the full SHA
    3cf1fbf View commit details
  2. Apply fallback in case of any exception coming out of createClass

    Closes gh-34423
    
    (cherry picked from commit 93134fd)
    jhoeller committed Feb 18, 2025

    Verified

    This commit was signed with the committer’s verified signature.
    jmikola Jeremy Mikola
    Copy the full SHA
    4862819 View commit details
  3. Apply fallback in case of initial SmartClassLoader mismatch as well

    See gh-34423
    
    (cherry picked from commit 6786e1c)
    jhoeller committed Feb 18, 2025
    Copy the full SHA
    b48d72c View commit details

Commits on Feb 19, 2025

  1. Copy the full SHA
    01ae0a7 View commit details

Commits on Feb 21, 2025

  1. Handle null values in MockHttpServletResponse#setHeader

    Prior to this commit, `MockHttpServletResponse#setHeader` would not
    remove the header entry when given a `null` value, as documented in the
    Servlet API.
    This commit ensures that this behavior is enforced.
    
    Fixes gh-34466
    bclozel committed Feb 21, 2025
    Copy the full SHA
    b5c89c9 View commit details
  2. Fix null value support in ContentCachingResponseWrapper

    Prior to this commit, calling `setHeader` on the response wrapper would
    have a separate code path for the "Content-Length" header. This did not
    support calls with `null` values and would result in an exception.
    
    This commit ensures that the cached content length value is reset in
    this case and that the call is forwarded properly to the superclass.
    
    Fixes gh-34465
    bclozel committed Feb 21, 2025
    Copy the full SHA
    ccf4b02 View commit details

Commits on Feb 23, 2025

  1. Copy the full SHA
    7460be6 View commit details

Commits on Feb 25, 2025

  1. Fix multiple Content-Language values in MockHttpServletResponse

    Prior to this commit, `MockHttpServletResponse` would only support
    adding a `Content-Language` once. Adding multiple header values would
    always replace the content-language property in the response and the
    entire header value.
    
    This commit ensures that this behavior is supported.
    
    Fixes gh-34491
    bclozel committed Feb 25, 2025
    Copy the full SHA
    c02d07f View commit details
  2. Avoid unnecessary CGLIB processing on configuration classes

    Closes gh-34486
    
    (cherry picked from commit aff9ac7)
    jhoeller committed Feb 25, 2025
    Copy the full SHA
    ea419d2 View commit details

Commits on Feb 26, 2025

  1. Copy the full SHA
    a018ae6 View commit details

Commits on Feb 28, 2025

  1. Defensively call isShutdown method for executor description

    Closes gh-34514
    
    (cherry picked from commit 559ea6c)
    jhoeller committed Feb 28, 2025
    Copy the full SHA
    0d60f26 View commit details
  2. Avoid getTargetConnection call on transaction-aware Connection close

    Closes gh-34484
    
    (cherry picked from commit c64dae3)
    jhoeller committed Feb 28, 2025
    Copy the full SHA
    1e31cd6 View commit details

Commits on Mar 12, 2025

  1. Upgrade to Reactor 2023.0.16

    Includes Netty 4.1.119 and Jetty 12.0.17
    
    Closes gh-34579
    jhoeller committed Mar 12, 2025
    Copy the full SHA
    9ea049a View commit details

Commits on Mar 13, 2025

  1. Release v6.1.18

    bclozel committed Mar 13, 2025
    Copy the full SHA
    1195bbd View commit details
Showing with 294 additions and 128 deletions.
  1. +1 −0 framework-docs/package.json
  2. +7 −7 framework-platform/framework-platform.gradle
  3. +1 −1 gradle.properties
  4. +11 −2 spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClass.java
  5. +5 −7 spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassEnhancer.java
  6. +44 −31 spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java
  7. +3 −1 spring-context/src/main/java/org/springframework/scheduling/config/ExecutorBeanDefinitionParser.java
  8. +3 −1 ...ng-context/src/main/java/org/springframework/scheduling/config/SchedulerBeanDefinitionParser.java
  9. +22 −2 ...xt/src/test/java/org/springframework/context/annotation/ConfigurationClassPostProcessorTests.java
  10. +7 −5 ...rc/test/java/org/springframework/context/annotation/InvalidConfigurationClassDefinitionTests.java
  11. +10 −9 spring-core/src/main/java/org/springframework/aot/hint/ResourceHints.java
  12. +5 −4 spring-core/src/main/java/org/springframework/aot/hint/RuntimeHintsRegistrar.java
  13. +15 −13 ...ng-core/src/main/java/org/springframework/aot/hint/support/FilePatternResourceHintsRegistrar.java
  14. +6 −5 ...ng-core/src/main/java/org/springframework/aot/hint/support/SpringFactoriesLoaderRuntimeHints.java
  15. +9 −5 spring-core/src/main/java/org/springframework/cglib/core/AbstractClassGenerator.java
  16. +8 −2 spring-core/src/main/java/org/springframework/core/task/TaskRejectedException.java
  17. +6 −2 spring-jdbc/src/main/java/org/springframework/jdbc/datasource/DataSourceUtils.java
  18. +13 −3 spring-jdbc/src/main/java/org/springframework/jdbc/datasource/TransactionAwareDataSourceProxy.java
  19. +43 −6 spring-jdbc/src/test/java/org/springframework/jdbc/datasource/DataSourceTransactionManagerTests.java
  20. +18 −10 spring-test/src/main/java/org/springframework/mock/web/MockHttpServletResponse.java
  21. +21 −1 spring-test/src/test/java/org/springframework/mock/web/MockHttpServletResponseTests.java
  22. +7 −1 spring-web/src/main/java/org/springframework/web/util/ContentCachingResponseWrapper.java
  23. +11 −0 spring-web/src/test/java/org/springframework/web/filter/ContentCachingResponseWrapperTests.java
  24. +18 −10 ...eb/src/testFixtures/java/org/springframework/web/testfixture/servlet/MockHttpServletResponse.java
1 change: 1 addition & 0 deletions framework-docs/package.json
Original file line number Diff line number Diff line change
@@ -5,6 +5,7 @@
"@antora/collector-extension": "1.0.0-alpha.3",
"@asciidoctor/tabs": "1.0.0-beta.6",
"@springio/antora-extensions": "1.11.1",
"fast-xml-parser": "4.5.2",
"@springio/asciidoctor-extensions": "1.0.0-alpha.10"
}
}
14 changes: 7 additions & 7 deletions framework-platform/framework-platform.gradle
Original file line number Diff line number Diff line change
@@ -9,15 +9,15 @@ javaPlatform {
dependencies {
api(platform("com.fasterxml.jackson:jackson-bom:2.15.4"))
api(platform("io.micrometer:micrometer-bom:1.12.12"))
api(platform("io.netty:netty-bom:4.1.118.Final"))
api(platform("io.netty:netty-bom:4.1.119.Final"))
api(platform("io.netty:netty5-bom:5.0.0.Alpha5"))
api(platform("io.projectreactor:reactor-bom:2023.0.15"))
api(platform("io.projectreactor:reactor-bom:2023.0.16"))
api(platform("io.rsocket:rsocket-bom:1.1.5"))
api(platform("org.apache.groovy:groovy-bom:4.0.24"))
api(platform("org.apache.logging.log4j:log4j-bom:2.21.1"))
api(platform("org.assertj:assertj-bom:3.27.3"))
api(platform("org.eclipse.jetty:jetty-bom:12.0.16"))
api(platform("org.eclipse.jetty.ee10:jetty-ee10-bom:12.0.16"))
api(platform("org.eclipse.jetty:jetty-bom:12.0.17"))
api(platform("org.eclipse.jetty.ee10:jetty-ee10-bom:12.0.17"))
api(platform("org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.7.3"))
api(platform("org.jetbrains.kotlinx:kotlinx-serialization-bom:1.6.3"))
api(platform("org.junit:junit-bom:5.10.5"))
@@ -101,8 +101,8 @@ dependencies {
api("org.apache.derby:derby:10.16.1.1")
api("org.apache.derby:derbyclient:10.16.1.1")
api("org.apache.derby:derbytools:10.16.1.1")
api("org.apache.httpcomponents.client5:httpclient5:5.4.1")
api("org.apache.httpcomponents.core5:httpcore5-reactive:5.3.1")
api("org.apache.httpcomponents.client5:httpclient5:5.4.2")
api("org.apache.httpcomponents.core5:httpcore5-reactive:5.3.3")
api("org.apache.poi:poi-ooxml:5.2.5")
api("org.apache.tomcat.embed:tomcat-embed-core:10.1.28")
api("org.apache.tomcat.embed:tomcat-embed-websocket:10.1.28")
@@ -116,7 +116,7 @@ dependencies {
api("org.codehaus.jettison:jettison:1.5.4")
api("org.crac:crac:1.4.0")
api("org.dom4j:dom4j:2.1.4")
api("org.eclipse.jetty:jetty-reactive-httpclient:4.0.8")
api("org.eclipse.jetty:jetty-reactive-httpclient:4.0.9")
api("org.eclipse.persistence:org.eclipse.persistence.jpa:3.0.4")
api("org.eclipse:yasson:2.0.4")
api("org.ehcache:ehcache:3.10.8")
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
version=6.1.17-SNAPSHOT
version=6.1.18

org.gradle.caching=true
org.gradle.jvmargs=-Xmx2048m
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2024 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -191,6 +191,15 @@ Set<BeanMethod> getBeanMethods() {
return this.beanMethods;
}

boolean hasNonStaticBeanMethods() {
for (BeanMethod beanMethod : this.beanMethods) {
if (!beanMethod.getMetadata().isStatic()) {
return true;
}
}
return false;
}

void addImportedResource(String importedResource, Class<? extends BeanDefinitionReader> readerClass) {
this.importedResources.put(importedResource, readerClass);
}
@@ -212,7 +221,7 @@ void validate(ProblemReporter problemReporter) {

// A configuration class may not be final (CGLIB limitation) unless it declares proxyBeanMethods=false
if (attributes != null && (Boolean) attributes.get("proxyBeanMethods")) {
if (this.metadata.isFinal()) {
if (hasNonStaticBeanMethods() && this.metadata.isFinal()) {
problemReporter.error(new FinalConfigurationProblem());
}
for (BeanMethod beanMethod : this.beanMethods) {
Original file line number Diff line number Diff line change
@@ -112,12 +112,11 @@ public Class<?> enhance(Class<?> configClass, @Nullable ClassLoader classLoader)

try {
// Use original ClassLoader if config class not locally loaded in overriding class loader
if (classLoader instanceof SmartClassLoader smartClassLoader &&
classLoader != configClass.getClassLoader()) {
boolean classLoaderMismatch = (classLoader != null && classLoader != configClass.getClassLoader());
if (classLoaderMismatch && classLoader instanceof SmartClassLoader smartClassLoader) {
classLoader = smartClassLoader.getOriginalClassLoader();
}
Enhancer enhancer = newEnhancer(configClass, classLoader);
boolean classLoaderMismatch = (classLoader != null && classLoader != configClass.getClassLoader());
Class<?> enhancedClass = createClass(enhancer, classLoaderMismatch);
if (logger.isTraceEnabled()) {
logger.trace(String.format("Successfully enhanced %s; enhanced class name is: %s",
@@ -168,9 +167,9 @@ private Class<?> createClass(Enhancer enhancer, boolean fallback) {
try {
subclass = enhancer.createClass();
}
catch (CodeGenerationException ex) {
catch (Throwable ex) {
if (!fallback) {
throw ex;
throw (ex instanceof CodeGenerationException cgex ? cgex : new CodeGenerationException(ex));
}
// Possibly a package-visible @Bean method declaration not accessible
// in the given ClassLoader -> retry with original ClassLoader
@@ -188,8 +187,7 @@ private Class<?> createClass(Enhancer enhancer, boolean fallback) {
/**
* Marker interface to be implemented by all @Configuration CGLIB subclasses.
* Facilitates idempotent behavior for {@link ConfigurationClassEnhancer#enhance}
* through checking to see if candidate classes are already assignable to it, e.g.
* have already been enhanced.
* through checking to see if candidate classes are already assignable to it.
* <p>Also extends {@link BeanFactoryAware}, as all enhanced {@code @Configuration}
* classes require access to the {@link BeanFactory} that created them.
* <p>Note that this interface is intended for framework-internal use only, however
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2023 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -81,10 +81,9 @@
* any number of ConfigurationClass objects because one Configuration class may import
* another using the {@link Import} annotation).
*
* <p>This class helps separate the concern of parsing the structure of a Configuration
* class from the concern of registering BeanDefinition objects based on the content of
* that model (with the exception of {@code @ComponentScan} annotations which need to be
* registered immediately).
* <p>This class helps separate the concern of parsing the structure of a Configuration class
* from the concern of registering BeanDefinition objects based on the content of that model
* (except {@code @ComponentScan} annotations which need to be registered immediately).
*
* <p>This ASM-based implementation avoids reflection and eager class loading in order to
* interoperate effectively with lazy class loading in a Spring ApplicationContext.
@@ -161,14 +160,22 @@ public void parse(Set<BeanDefinitionHolder> configCandidates) {
for (BeanDefinitionHolder holder : configCandidates) {
BeanDefinition bd = holder.getBeanDefinition();
try {
ConfigurationClass configClass;
if (bd instanceof AnnotatedBeanDefinition annotatedBeanDef) {
parse(annotatedBeanDef.getMetadata(), holder.getBeanName());
configClass = parse(annotatedBeanDef.getMetadata(), holder.getBeanName());
}
else if (bd instanceof AbstractBeanDefinition abstractBeanDef && abstractBeanDef.hasBeanClass()) {
parse(abstractBeanDef.getBeanClass(), holder.getBeanName());
configClass = parse(abstractBeanDef.getBeanClass(), holder.getBeanName());
}
else {
parse(bd.getBeanClassName(), holder.getBeanName());
configClass = parse(bd.getBeanClassName(), holder.getBeanName());
}

// Downgrade to lite (no enhancement) in case of no instance-level @Bean methods.
if (!configClass.hasNonStaticBeanMethods() && ConfigurationClassUtils.CONFIGURATION_CLASS_FULL.equals(
bd.getAttribute(ConfigurationClassUtils.CONFIGURATION_CLASS_ATTRIBUTE))) {
bd.setAttribute(ConfigurationClassUtils.CONFIGURATION_CLASS_ATTRIBUTE,
ConfigurationClassUtils.CONFIGURATION_CLASS_LITE);
}
}
catch (BeanDefinitionStoreException ex) {
@@ -183,31 +190,37 @@ else if (bd instanceof AbstractBeanDefinition abstractBeanDef && abstractBeanDef
this.deferredImportSelectorHandler.process();
}

protected final void parse(@Nullable String className, String beanName) throws IOException {
Assert.notNull(className, "No bean class name for configuration class bean definition");
MetadataReader reader = this.metadataReaderFactory.getMetadataReader(className);
processConfigurationClass(new ConfigurationClass(reader, beanName), DEFAULT_EXCLUSION_FILTER);
final ConfigurationClass parse(AnnotationMetadata metadata, String beanName) {
ConfigurationClass configClass = new ConfigurationClass(metadata, beanName);
processConfigurationClass(configClass, DEFAULT_EXCLUSION_FILTER);
return configClass;
}

protected final void parse(Class<?> clazz, String beanName) throws IOException {
processConfigurationClass(new ConfigurationClass(clazz, beanName), DEFAULT_EXCLUSION_FILTER);
final ConfigurationClass parse(Class<?> clazz, String beanName) {
ConfigurationClass configClass = new ConfigurationClass(clazz, beanName);
processConfigurationClass(configClass, DEFAULT_EXCLUSION_FILTER);
return configClass;
}

protected final void parse(AnnotationMetadata metadata, String beanName) throws IOException {
processConfigurationClass(new ConfigurationClass(metadata, beanName), DEFAULT_EXCLUSION_FILTER);
final ConfigurationClass parse(@Nullable String className, String beanName) throws IOException {
Assert.notNull(className, "No bean class name for configuration class bean definition");
MetadataReader reader = this.metadataReaderFactory.getMetadataReader(className);
ConfigurationClass configClass = new ConfigurationClass(reader, beanName);
processConfigurationClass(configClass, DEFAULT_EXCLUSION_FILTER);
return configClass;
}

/**
* Validate each {@link ConfigurationClass} object.
* @see ConfigurationClass#validate
*/
public void validate() {
void validate() {
for (ConfigurationClass configClass : this.configurationClasses.keySet()) {
configClass.validate(this.problemReporter);
}
}

public Set<ConfigurationClass> getConfigurationClasses() {
Set<ConfigurationClass> getConfigurationClasses() {
return this.configurationClasses.keySet();
}

@@ -216,7 +229,7 @@ List<PropertySourceDescriptor> getPropertySourceDescriptors() {
Collections.emptyList());
}

protected void processConfigurationClass(ConfigurationClass configClass, Predicate<String> filter) throws IOException {
protected void processConfigurationClass(ConfigurationClass configClass, Predicate<String> filter) {
if (this.conditionEvaluator.shouldSkip(configClass.getMetadata(), ConfigurationPhase.PARSE_CONFIGURATION)) {
return;
}
@@ -448,7 +461,7 @@ private Set<MethodMetadata> retrieveBeanMethodMetadata(SourceClass sourceClass)


/**
* Returns {@code @Import} class, considering all meta-annotations.
* Returns {@code @Import} classes, considering all meta-annotations.
*/
private Set<SourceClass> getImports(SourceClass sourceClass) throws IOException {
Set<SourceClass> imports = new LinkedHashSet<>();
@@ -636,7 +649,7 @@ private static class ImportStack extends ArrayDeque<ConfigurationClass> implemen

private final MultiValueMap<String, AnnotationMetadata> imports = new LinkedMultiValueMap<>();

public void registerImport(AnnotationMetadata importingClass, String importedClass) {
void registerImport(AnnotationMetadata importingClass, String importedClass) {
this.imports.add(importedClass, importingClass);
}

@@ -691,7 +704,7 @@ private class DeferredImportSelectorHandler {
* @param configClass the source configuration class
* @param importSelector the selector to handle
*/
public void handle(ConfigurationClass configClass, DeferredImportSelector importSelector) {
void handle(ConfigurationClass configClass, DeferredImportSelector importSelector) {
DeferredImportSelectorHolder holder = new DeferredImportSelectorHolder(configClass, importSelector);
if (this.deferredImportSelectors == null) {
DeferredImportSelectorGroupingHandler handler = new DeferredImportSelectorGroupingHandler();
@@ -703,7 +716,7 @@ public void handle(ConfigurationClass configClass, DeferredImportSelector import
}
}

public void process() {
void process() {
List<DeferredImportSelectorHolder> deferredImports = this.deferredImportSelectors;
this.deferredImportSelectors = null;
try {
@@ -727,7 +740,7 @@ private class DeferredImportSelectorGroupingHandler {

private final Map<AnnotationMetadata, ConfigurationClass> configurationClasses = new HashMap<>();

public void register(DeferredImportSelectorHolder deferredImport) {
void register(DeferredImportSelectorHolder deferredImport) {
Class<? extends Group> group = deferredImport.getImportSelector().getImportGroup();
DeferredImportSelectorGrouping grouping = this.groupings.computeIfAbsent(
(group != null ? group : deferredImport),
@@ -737,7 +750,7 @@ public void register(DeferredImportSelectorHolder deferredImport) {
deferredImport.getConfigurationClass());
}

public void processGroupImports() {
void processGroupImports() {
for (DeferredImportSelectorGrouping grouping : this.groupings.values()) {
Predicate<String> exclusionFilter = grouping.getCandidateFilter();
grouping.getImports().forEach(entry -> {
@@ -775,16 +788,16 @@ private static class DeferredImportSelectorHolder {

private final DeferredImportSelector importSelector;

public DeferredImportSelectorHolder(ConfigurationClass configClass, DeferredImportSelector selector) {
DeferredImportSelectorHolder(ConfigurationClass configClass, DeferredImportSelector selector) {
this.configurationClass = configClass;
this.importSelector = selector;
}

public ConfigurationClass getConfigurationClass() {
ConfigurationClass getConfigurationClass() {
return this.configurationClass;
}

public DeferredImportSelector getImportSelector() {
DeferredImportSelector getImportSelector() {
return this.importSelector;
}
}
@@ -800,23 +813,23 @@ private static class DeferredImportSelectorGrouping {
this.group = group;
}

public void add(DeferredImportSelectorHolder deferredImport) {
void add(DeferredImportSelectorHolder deferredImport) {
this.deferredImports.add(deferredImport);
}

/**
* Return the imports defined by the group.
* @return each import with its associated configuration class
*/
public Iterable<Group.Entry> getImports() {
Iterable<Group.Entry> getImports() {
for (DeferredImportSelectorHolder deferredImport : this.deferredImports) {
this.group.process(deferredImport.getConfigurationClass().getMetadata(),
deferredImport.getImportSelector());
}
return this.group.selectImports();
}

public Predicate<String> getCandidateFilter() {
Predicate<String> getCandidateFilter() {
Predicate<String> mergedFilter = DEFAULT_EXCLUSION_FILTER;
for (DeferredImportSelectorHolder deferredImport : this.deferredImports) {
Predicate<String> selectorFilter = deferredImport.getImportSelector().getExclusionFilter();
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2023 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@

import org.w3c.dom.Element;

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
@@ -53,6 +54,7 @@ protected void doParse(Element element, ParserContext parserContext, BeanDefinit
if (StringUtils.hasText(poolSize)) {
builder.addPropertyValue("poolSize", poolSize);
}
builder.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
}

private void configureRejectionPolicy(Element element, BeanDefinitionBuilder builder) {
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2012 the original author or authors.
* Copyright 2002-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@

import org.w3c.dom.Element;

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.util.StringUtils;
@@ -41,6 +42,7 @@ protected void doParse(Element element, BeanDefinitionBuilder builder) {
if (StringUtils.hasText(poolSize)) {
builder.addPropertyValue("poolSize", poolSize);
}
builder.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
}

}
Loading