Skip to content

Commit cf9de07

Browse files
crazysaltfish寻芳
and
寻芳
authored
fix 并行调用多例Bean时 annotationWrapper 导致的线程安全问题 (#1354)
* fix 并行调用多例Bean时 annotationWrapper 导致的线程安全问题 * fix 并行调用多例Bean时 annotationWrapper 导致的线程安全问题 * format code --------- Co-authored-by: 寻芳 <[email protected]>
1 parent 8c5adac commit cf9de07

File tree

1 file changed

+21
-11
lines changed

1 file changed

+21
-11
lines changed

sofa-boot-project/sofa-boot-core/runtime-sofa-boot/src/main/java/com/alipay/sofa/runtime/spring/ReferenceAnnotationBeanPostProcessor.java

+21-11
Original file line numberDiff line numberDiff line change
@@ -56,18 +56,18 @@
5656
public class ReferenceAnnotationBeanPostProcessor implements BeanPostProcessor,
5757
ApplicationContextAware, PriorityOrdered {
5858

59-
private static final Logger LOGGER = SofaBootLoggerFactory
60-
.getLogger(ReferenceAnnotationBeanPostProcessor.class);
59+
private static final Logger LOGGER = SofaBootLoggerFactory
60+
.getLogger(ReferenceAnnotationBeanPostProcessor.class);
6161

62-
private final SofaRuntimeContext sofaRuntimeContext;
62+
private final SofaRuntimeContext sofaRuntimeContext;
6363

64-
private final BindingAdapterFactory bindingAdapterFactory;
64+
private final BindingAdapterFactory bindingAdapterFactory;
6565

66-
private final BindingConverterFactory bindingConverterFactory;
66+
private final BindingConverterFactory bindingConverterFactory;
6767

68-
private ApplicationContext applicationContext;
68+
private ApplicationContext applicationContext;
6969

70-
private AnnotationWrapper<SofaReference> annotationWrapper;
70+
private final ThreadLocal<AnnotationWrapper<SofaReference>> annotationWrapper = new ThreadLocal<>();
7171

7272
/**
7373
* To construct a ReferenceAnnotationBeanPostProcessor via a Spring Bean
@@ -97,7 +97,10 @@ private void processSofaReference(final Object bean, String beanName) {
9797
return;
9898
}
9999

100-
sofaReferenceAnnotation = annotationWrapper.wrap(sofaReferenceAnnotation);
100+
if (annotationWrapper.get() == null) {
101+
annotationWrapper.set(createAnnotationWrapper());
102+
}
103+
sofaReferenceAnnotation = annotationWrapper.get().wrap(sofaReferenceAnnotation);
101104

102105
Class<?> interfaceType = sofaReferenceAnnotation.interfaceType();
103106
if (interfaceType.equals(void.class)) {
@@ -130,7 +133,10 @@ private void processSofaReference(final Object bean, String beanName) {
130133
return;
131134
}
132135

133-
sofaReferenceAnnotation = annotationWrapper.wrap(sofaReferenceAnnotation);
136+
if (annotationWrapper.get() == null) {
137+
annotationWrapper.set(createAnnotationWrapper());
138+
}
139+
sofaReferenceAnnotation = annotationWrapper.get().wrap(sofaReferenceAnnotation);
134140

135141
Class<?> interfaceType = sofaReferenceAnnotation.interfaceType();
136142
if (interfaceType.equals(void.class)) {
@@ -182,8 +188,12 @@ public int getOrder() {
182188
@Override
183189
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
184190
this.applicationContext = applicationContext;
185-
this.annotationWrapper = AnnotationWrapper.create(SofaReference.class)
186-
.withEnvironment(applicationContext.getEnvironment())
191+
this.annotationWrapper.set(createAnnotationWrapper());
192+
}
193+
194+
private AnnotationWrapper<SofaReference> createAnnotationWrapper() {
195+
return AnnotationWrapper.create(SofaReference.class)
196+
.withEnvironment(this.applicationContext.getEnvironment())
187197
.withBinder(DefaultPlaceHolderBinder.INSTANCE);
188198
}
189199
}

0 commit comments

Comments
 (0)