@@ -27,6 +27,7 @@ final class DBeanScopeBuilder implements BeanScopeBuilder.ForTesting {
27
27
private final List <EnrichBean > enrichBeans = new ArrayList <>();
28
28
private final Set <Module > includeModules = new LinkedHashSet <>();
29
29
private final List <Runnable > postConstructList = new ArrayList <>();
30
+ private final List <Consumer <BeanScope >> postConstructConsumerList = new ArrayList <>();
30
31
private final List <AutoCloseable > preDestroyList = new ArrayList <>();
31
32
private BeanScope parent ;
32
33
private boolean parentOverride = true ;
@@ -73,7 +74,7 @@ public PropertyRequiresPlugin propertyPlugin() {
73
74
74
75
@ Override
75
76
public BeanScopeBuilder beans (Object ... beans ) {
76
- for (Object bean : beans ) {
77
+ for (final Object bean : beans ) {
77
78
suppliedBeans .add (SuppliedBean .of (superOf (bean .getClass ()), bean ));
78
79
}
79
80
return this ;
@@ -114,6 +115,12 @@ public BeanScopeBuilder addPostConstructHooks(Runnable... postConstructRunnable)
114
115
return this ;
115
116
}
116
117
118
+ @ Override
119
+ public BeanScopeBuilder addPostConstructConsumerHook (Consumer <BeanScope > postConstructConsumer ) {
120
+ this .postConstructConsumerList .add (postConstructConsumer );
121
+ return this ;
122
+ }
123
+
117
124
@ Override
118
125
public BeanScopeBuilder addPreDestroyHooks (AutoCloseable ... closables ) {
119
126
Collections .addAll (this .preDestroyList , closables );
@@ -200,14 +207,14 @@ private boolean detectAvajeConfig() {
200
207
try {
201
208
Class .forName ("io.avaje.config.Configuration" , false , classLoader );
202
209
return true ;
203
- } catch (ClassNotFoundException e ) {
210
+ } catch (final ClassNotFoundException e ) {
204
211
return false ;
205
212
}
206
213
}
207
214
208
215
@ Override
209
216
public BeanScope build () {
210
- var start = System .currentTimeMillis ();
217
+ final var start = System .currentTimeMillis ();
211
218
// load and apply plugins first
212
219
initClassLoader ();
213
220
if (propertyRequiresPlugin == null ) {
@@ -216,12 +223,12 @@ public BeanScope build() {
216
223
217
224
ServiceLoader .load (Plugin .class , classLoader ).forEach (plugin -> plugin .apply (this ));
218
225
// sort factories by dependsOn
219
- FactoryOrder factoryOrder = new FactoryOrder (parent , includeModules , !suppliedBeans .isEmpty ());
226
+ final FactoryOrder factoryOrder = new FactoryOrder (parent , includeModules , !suppliedBeans .isEmpty ());
220
227
if (factoryOrder .isEmpty ()) {
221
228
ServiceLoader .load (Module .class , classLoader ).forEach (factoryOrder ::add );
222
229
}
223
230
224
- Set <String > moduleNames = factoryOrder .orderFactories ();
231
+ final Set <String > moduleNames = factoryOrder .orderFactories ();
225
232
if (moduleNames .isEmpty ()) {
226
233
throw new IllegalStateException ("No modules found. When using java module system we need an explicit provides clause in module-info like:\n \n " +
227
234
" provides io.avaje.inject.spi.Module with org.example.ExampleModule;\n \n " +
@@ -231,12 +238,13 @@ public BeanScope build() {
231
238
}
232
239
log .log (DEBUG , "building with modules {0}" , moduleNames );
233
240
234
- Builder builder = Builder .newBuilder (propertyRequiresPlugin , suppliedBeans , enrichBeans , parent , parentOverride );
235
- for (Module factory : factoryOrder .factories ()) {
241
+ final Builder builder = Builder .newBuilder (propertyRequiresPlugin , suppliedBeans , enrichBeans , parent , parentOverride );
242
+ for (final Module factory : factoryOrder .factories ()) {
236
243
factory .build (builder );
237
244
}
238
245
239
246
postConstructList .forEach (builder ::addPostConstruct );
247
+ postConstructConsumerList .forEach (builder ::addPostConstruct );
240
248
preDestroyList .forEach (builder ::addPreDestroy );
241
249
return builder .build (shutdownHook , start );
242
250
}
@@ -245,7 +253,7 @@ public BeanScope build() {
245
253
* Return the type that we map the supplied bean to.
246
254
*/
247
255
private static Class <?> superOf (Class <?> suppliedClass ) {
248
- Class <?> suppliedSuper = suppliedClass .getSuperclass ();
256
+ final Class <?> suppliedSuper = suppliedClass .getSuperclass ();
249
257
if (Object .class .equals (suppliedSuper )) {
250
258
return suppliedClass ;
251
259
} else {
@@ -272,13 +280,13 @@ static class FactoryOrder {
272
280
this .parent = parent ;
273
281
this .factories .addAll (includeModules );
274
282
this .suppliedBeans = suppliedBeans ;
275
- for (Module includeModule : includeModules ) {
283
+ for (final Module includeModule : includeModules ) {
276
284
moduleNames .add (includeModule .getClass ().getName ());
277
285
}
278
286
}
279
287
280
288
void add (Module module ) {
281
- FactoryState factoryState = new FactoryState (module );
289
+ final FactoryState factoryState = new FactoryState (module );
282
290
providesMap .computeIfAbsent (module .getClass ().getTypeName (), s -> new FactoryList ()).add (factoryState );
283
291
addFactoryProvides (factoryState , module .provides ());
284
292
addFactoryProvides (factoryState , module .autoProvides ());
@@ -299,7 +307,7 @@ void add(Module module) {
299
307
}
300
308
301
309
private void addFactoryProvides (FactoryState factoryState , Class <?>[] provides ) {
302
- for (Class <?> feature : provides ) {
310
+ for (final Class <?> feature : provides ) {
303
311
providesMap .computeIfAbsent (feature .getTypeName (), s -> new FactoryList ()).add (factoryState );
304
312
}
305
313
}
@@ -319,7 +327,7 @@ private void push(FactoryState factory) {
319
327
Set <String > orderFactories () {
320
328
// push the 'no dependency' modules after the 'provides only' ones
321
329
// as this is more intuitive for the simple (only provides modules case)
322
- for (FactoryState factoryState : queueNoDependencies ) {
330
+ for (final FactoryState factoryState : queueNoDependencies ) {
323
331
push (factoryState );
324
332
}
325
333
processQueue ();
@@ -345,12 +353,12 @@ private void processQueue() {
345
353
if (suppliedBeans ) {
346
354
// just push everything left assuming supplied beans
347
355
// will satisfy the required dependencies
348
- for (FactoryState factoryState : queue ) {
356
+ for (final FactoryState factoryState : queue ) {
349
357
push (factoryState );
350
358
}
351
359
} else if (!queue .isEmpty ()) {
352
- StringBuilder sb = new StringBuilder ();
353
- for (FactoryState factory : queue ) {
360
+ final StringBuilder sb = new StringBuilder ();
361
+ for (final FactoryState factory : queue ) {
354
362
sb .append ("Module [" ).append (factory ).append ("] has unsatisfied" );
355
363
unsatisfiedRequires (sb , factory .requires (), "requires" );
356
364
unsatisfiedRequires (sb , factory .requiresPackages (), "requiresPackages" );
@@ -366,7 +374,7 @@ private void processQueue() {
366
374
}
367
375
368
376
private void unsatisfiedRequires (StringBuilder sb , Class <?>[] requiredType , String requires ) {
369
- for (Class <?> depModuleName : requiredType ) {
377
+ for (final Class <?> depModuleName : requiredType ) {
370
378
if (notProvided (depModuleName .getTypeName ())) {
371
379
sb .append (String .format (" %s [%s]" , requires , depModuleName .getTypeName ()));
372
380
}
@@ -377,7 +385,7 @@ private boolean notProvided(String dependency) {
377
385
if (parent != null && parent .contains (dependency )) {
378
386
return false ;
379
387
}
380
- FactoryList factories = providesMap .get (dependency );
388
+ final FactoryList factories = providesMap .get (dependency );
381
389
return (factories == null || !factories .allPushed ());
382
390
}
383
391
@@ -389,9 +397,9 @@ private boolean notProvided(String dependency) {
389
397
*/
390
398
private int processQueuedFactories () {
391
399
int count = 0 ;
392
- Iterator <FactoryState > it = queue .iterator ();
400
+ final Iterator <FactoryState > it = queue .iterator ();
393
401
while (it .hasNext ()) {
394
- FactoryState factory = it .next ();
402
+ final FactoryState factory = it .next ();
395
403
if (satisfiedDependencies (factory )) {
396
404
// push the factory onto the build order
397
405
it .remove ();
@@ -503,7 +511,7 @@ void add(FactoryState factory) {
503
511
* Return true if all factories here have been pushed onto the build order.
504
512
*/
505
513
boolean allPushed () {
506
- for (FactoryState factory : factories ) {
514
+ for (final FactoryState factory : factories ) {
507
515
if (!factory .isPushed ()) {
508
516
return false ;
509
517
}
0 commit comments