4141import static io .microsphere .collection .MapUtils .newLinkedHashMap ;
4242import static io .microsphere .logging .LoggerFactory .getLogger ;
4343import static io .microsphere .spring .beans .BeanUtils .isBeanPresent ;
44+ import static io .microsphere .spring .beans .factory .BeanFactoryUtils .asDefaultListableBeanFactory ;
4445import static io .microsphere .spring .cloud .client .actuator .FeaturesUtils .getAbstractFeaturePropertyName ;
4546import static io .microsphere .spring .cloud .client .actuator .FeaturesUtils .getHasFeaturesBeanName ;
4647import 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 ();
0 commit comments