Skip to content

Commit df3b706

Browse files
committed
Make moduleFeaturesMap local; use BeanFactory helper
Refactor ConfigurationPropertyHasFeaturesAutoConfiguration to keep moduleFeaturesMap as a local variable instead of a long-lived field and pass it into helper methods. Use BeanFactoryUtils.asDefaultListableBeanFactory(...) when setting the beanFactory for safer conversion. Clear the local map after registering HasFeatures beans. Update tests to expect WebClient as an abstract feature for the "web" module and adjust assertions accordingly.
1 parent c4d5895 commit df3b706

2 files changed

Lines changed: 24 additions & 19 deletions

File tree

microsphere-spring-cloud-commons/src/main/java/io/microsphere/spring/cloud/client/actuator/ConfigurationPropertyHasFeaturesAutoConfiguration.java

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import static io.microsphere.collection.MapUtils.newLinkedHashMap;
4242
import static io.microsphere.logging.LoggerFactory.getLogger;
4343
import static io.microsphere.spring.beans.BeanUtils.isBeanPresent;
44+
import static io.microsphere.spring.beans.factory.BeanFactoryUtils.asDefaultListableBeanFactory;
4445
import static io.microsphere.spring.cloud.client.actuator.FeaturesUtils.getAbstractFeaturePropertyName;
4546
import static io.microsphere.spring.cloud.client.actuator.FeaturesUtils.getHasFeaturesBeanName;
4647
import static io.microsphere.spring.cloud.client.actuator.FeaturesUtils.getNamedFeaturePropertyName;
@@ -93,8 +94,6 @@ public class ConfigurationPropertyHasFeaturesAutoConfiguration implements BeanFa
9394

9495
private DefaultListableBeanFactory beanFactory;
9596

96-
private final Map<String, ModuleFeatures> moduleFeaturesMap = newLinkedHashMap();
97-
9897
@Autowired
9998
private FeaturesProperties featuresProperties;
10099

@@ -105,17 +104,18 @@ public void setBeanClassLoader(ClassLoader classLoader) {
105104

106105
@Override
107106
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
108-
this.beanFactory = (DefaultListableBeanFactory) beanFactory;
107+
this.beanFactory = asDefaultListableBeanFactory(beanFactory);
109108
}
110109

111110
@Override
112111
public void afterPropertiesSet() {
113112
FeaturesProperties featuresProperties = this.featuresProperties;
114113

114+
Map<String, ModuleFeatures> moduleFeaturesMap = newLinkedHashMap();
115115
Map<String, List<String>> abstractProperties = featuresProperties.getAbstract();
116116

117117
abstractProperties.forEach((moduleName, featureClassNames) -> {
118-
addAbstractFeatureClassNames(moduleName, featureClassNames);
118+
addAbstractFeatureClassNames(moduleName, featureClassNames, moduleFeaturesMap);
119119
});
120120

121121
Map<String, Map<String, String>> namedProperties = featuresProperties.getNamed();
@@ -124,14 +124,15 @@ public void afterPropertiesSet() {
124124
for (Entry<String, String> entry : namedFeatures.entrySet()) {
125125
String featureName = entry.getKey();
126126
String featureClassName = entry.getValue();
127-
addNamedFeatureClassName(moduleName, featureName, featureClassName);
127+
addNamedFeatureClassName(moduleName, featureName, featureClassName, moduleFeaturesMap);
128128
}
129129
});
130130

131-
registerHasFeaturesBeans();
131+
registerHasFeaturesBeans(moduleFeaturesMap);
132+
moduleFeaturesMap.clear();
132133
}
133134

134-
private void addAbstractFeatureClassNames(String moduleName, List<String> featureClassNames) {
135+
private void addAbstractFeatureClassNames(String moduleName, List<String> featureClassNames, Map<String, ModuleFeatures> moduleFeaturesMap) {
135136
for (String featureClassName : featureClassNames) {
136137
Class<?> featureClass = loadClass(featureClassName);
137138
if (featureClass == null) {
@@ -140,18 +141,18 @@ private void addAbstractFeatureClassNames(String moduleName, List<String> featur
140141
featureClassName, propertyName);
141142
continue;
142143
}
143-
addAbstractFeatureClass(moduleName, featureClass);
144+
addAbstractFeatureClass(moduleName, featureClass, moduleFeaturesMap);
144145
}
145146
}
146147

147-
private void addAbstractFeatureClass(String moduleName, Class<?> featureClass) {
148-
ModuleFeatures moduleFeatures = getModuleFeatures(moduleName);
148+
private void addAbstractFeatureClass(String moduleName, Class<?> featureClass, Map<String, ModuleFeatures> moduleFeaturesMap) {
149+
ModuleFeatures moduleFeatures = getModuleFeatures(moduleFeaturesMap, moduleName);
149150
logger.trace("The AbstractFeature[moduel: '{}' , class : '{}'] will be added in the HasFeatures.", moduleName,
150151
featureClass.getName());
151152
moduleFeatures.abstractFeatures.add(featureClass);
152153
}
153154

154-
private void addNamedFeatureClassName(String moduleName, String featureName, String featureClassName) {
155+
private void addNamedFeatureClassName(String moduleName, String featureName, String featureClassName, Map<String, ModuleFeatures> moduleFeaturesMap) {
155156
String name = getQualifierFeatureName(moduleName, featureName);
156157
Class<?> featureClass = loadClass(featureClassName);
157158
String propertyName = getNamedFeaturePropertyName(moduleName, featureName);
@@ -165,25 +166,25 @@ private void addNamedFeatureClassName(String moduleName, String featureName, Str
165166
logger.trace("The NamedFeature[name : '{}' , class : '{}' , configuration property : '{}'] will be added in the HasFeatures.",
166167
name, featureClassName, propertyName);
167168
NamedFeature namedFeature = new NamedFeature(name, featureClass);
168-
ModuleFeatures moduleFeatures = getModuleFeatures(moduleName);
169+
ModuleFeatures moduleFeatures = getModuleFeatures(moduleFeaturesMap, moduleName);
169170
moduleFeatures.namedFeatures.add(namedFeature);
170171
} else {
171172
logger.warn("No bean of named feature[name : '{}' , class : '{}'] is present in the BeanFactory, so it will be fallback as an abstract feature, please check the configuration property : '{}'",
172173
name, featureClassName, propertyName);
173-
addAbstractFeatureClass(moduleName, featureClass);
174+
addAbstractFeatureClass(moduleName, featureClass, moduleFeaturesMap);
174175
}
175176
}
176177

177178
private Class<?> loadClass(String className) {
178179
return resolveClass(className, this.classLoader);
179180
}
180181

181-
private ModuleFeatures getModuleFeatures(String moduleName) {
182-
return this.moduleFeaturesMap.computeIfAbsent(moduleName, ModuleFeatures::new);
182+
private ModuleFeatures getModuleFeatures(Map<String, ModuleFeatures> moduleFeaturesMap, String moduleName) {
183+
return moduleFeaturesMap.computeIfAbsent(moduleName, ModuleFeatures::new);
183184
}
184185

185-
private void registerHasFeaturesBeans() {
186-
for (Entry<String, ModuleFeatures> entry : this.moduleFeaturesMap.entrySet()) {
186+
private void registerHasFeaturesBeans(Map<String, ModuleFeatures> moduleFeaturesMap) {
187+
for (Entry<String, ModuleFeatures> entry : moduleFeaturesMap.entrySet()) {
187188
String moduleName = entry.getKey();
188189
ModuleFeatures moduleFeatures = entry.getValue();
189190
HasFeatures hasFeatures = moduleFeatures.toHasFeatures();

microsphere-spring-cloud-commons/src/test/java/io/microsphere/spring/cloud/client/actuator/ConfigurationPropertyHasFeaturesAutoConfigurationTest.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.springframework.cloud.client.actuator.NamedFeature;
2727
import org.springframework.web.client.RestOperations;
2828
import org.springframework.web.client.RestTemplate;
29+
import org.springframework.web.reactive.function.client.WebClient;
2930

3031
import java.util.List;
3132
import java.util.Map;
@@ -74,12 +75,15 @@ void test() {
7475
assertNull(hasFeatures);
7576

7677
hasFeatures = this.hasFeaturesBeansMap.get(getHasFeaturesBeanName("web"));
77-
assertNull(hasFeatures);
78+
assertNotNull(hasFeatures);
79+
List<Class<?>> abstractFeatures = hasFeatures.getAbstractFeatures();
80+
assertEquals(1, abstractFeatures.size());
81+
assertEquals(WebClient.class, abstractFeatures.get(0));
7882

7983
hasFeatures = this.hasFeaturesBeansMap.get(getHasFeaturesBeanName("rest"));
8084
assertNotNull(hasFeatures);
8185

82-
List<Class<?>> abstractFeatures = hasFeatures.getAbstractFeatures();
86+
abstractFeatures = hasFeatures.getAbstractFeatures();
8387
assertEquals(1, abstractFeatures.size());
8488
assertEquals(RestOperations.class, abstractFeatures.get(0));
8589

0 commit comments

Comments
 (0)