Browse Source

Use SingletonSupplier for XStream instance in XStreamMarshaller

Closes gh-25017
pull/25038/head
Sam Brannen 5 years ago
parent
commit
4805288122
  1. 22
      spring-oxm/src/main/java/org/springframework/oxm/xstream/XStreamMarshaller.java

22
spring-oxm/src/main/java/org/springframework/oxm/xstream/XStreamMarshaller.java

@ -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…
Cancel
Save