Use SingletonSupplier for XStream instance in XStreamMarshaller
Closes gh-25017
This commit is contained in:
parent
ce11fdfa80
commit
4805288122
|
|
@ -84,6 +84,7 @@ import org.springframework.oxm.support.AbstractMarshaller;
|
||||||
import org.springframework.util.ClassUtils;
|
import org.springframework.util.ClassUtils;
|
||||||
import org.springframework.util.ObjectUtils;
|
import org.springframework.util.ObjectUtils;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
|
import org.springframework.util.function.SingletonSupplier;
|
||||||
import org.springframework.util.xml.StaxUtils;
|
import org.springframework.util.xml.StaxUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -187,8 +188,7 @@ public class XStreamMarshaller extends AbstractMarshaller implements BeanClassLo
|
||||||
|
|
||||||
private ClassLoader beanClassLoader = new CompositeClassLoader();
|
private ClassLoader beanClassLoader = new CompositeClassLoader();
|
||||||
|
|
||||||
@Nullable
|
private final SingletonSupplier<XStream> xstream = SingletonSupplier.of(this::buildXStream);
|
||||||
private volatile XStream xstream;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -407,12 +407,12 @@ public class XStreamMarshaller extends AbstractMarshaller implements BeanClassLo
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void afterPropertiesSet() {
|
public void afterPropertiesSet() {
|
||||||
this.xstream = buildXStream();
|
// no-op due to use of SingletonSupplier for the XStream field.
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build the native XStream delegate to be used by this marshaller,
|
* Build the native XStream delegate to be used by this marshaller,
|
||||||
* delegating to {@link #constructXStream()}, {@link #configureXStream}
|
* delegating to {@link #constructXStream}, {@link #configureXStream},
|
||||||
* and {@link #customizeXStream}.
|
* and {@link #customizeXStream}.
|
||||||
*/
|
*/
|
||||||
protected XStream buildXStream() {
|
protected XStream buildXStream() {
|
||||||
|
|
@ -617,21 +617,11 @@ public class XStreamMarshaller extends AbstractMarshaller implements BeanClassLo
|
||||||
* <p><b>NOTE: This method has been marked as final as of Spring 4.0.</b>
|
* <p><b>NOTE: This method has been marked as final as of Spring 4.0.</b>
|
||||||
* It can be used to access the fully configured XStream for marshalling
|
* It can be used to access the fully configured XStream for marshalling
|
||||||
* but not configuration purposes anymore.
|
* but not configuration purposes anymore.
|
||||||
* <p>As of Spring Framework 5.2.7, creation of the {@link XStream} instance
|
* <p>As of Spring Framework 5.1.16, creation of the {@link XStream} instance
|
||||||
* returned by this method is thread safe.
|
* returned by this method is thread safe.
|
||||||
*/
|
*/
|
||||||
public final XStream getXStream() {
|
public final XStream getXStream() {
|
||||||
XStream xs = this.xstream;
|
return this.xstream.obtain();
|
||||||
if (xs == null) {
|
|
||||||
synchronized (this) {
|
|
||||||
xs = this.xstream;
|
|
||||||
if (xs == null) {
|
|
||||||
xs = buildXStream();
|
|
||||||
this.xstream = xs;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return xs;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue