@@ -27,6 +27,7 @@ final class DBeanScopeBuilder implements BeanScopeBuilder.ForTesting {
2727 private final List <EnrichBean > enrichBeans = new ArrayList <>();
2828 private final Set <Module > includeModules = new LinkedHashSet <>();
2929 private final List <Runnable > postConstructList = new ArrayList <>();
30+ private final List <Consumer <BeanScope >> postConstructConsumerList = new ArrayList <>();
3031 private final List <AutoCloseable > preDestroyList = new ArrayList <>();
3132 private BeanScope parent ;
3233 private boolean parentOverride = true ;
@@ -73,7 +74,7 @@ public PropertyRequiresPlugin propertyPlugin() {
7374
7475 @ Override
7576 public BeanScopeBuilder beans (Object ... beans ) {
76- for (Object bean : beans ) {
77+ for (final Object bean : beans ) {
7778 suppliedBeans .add (SuppliedBean .of (superOf (bean .getClass ()), bean ));
7879 }
7980 return this ;
@@ -114,6 +115,12 @@ public BeanScopeBuilder addPostConstructHooks(Runnable... postConstructRunnable)
114115 return this ;
115116 }
116117
118+ @ Override
119+ public BeanScopeBuilder addPostConstructConsumerHook (Consumer <BeanScope > postConstructConsumer ) {
120+ this .postConstructConsumerList .add (postConstructConsumer );
121+ return this ;
122+ }
123+
117124 @ Override
118125 public BeanScopeBuilder addPreDestroyHooks (AutoCloseable ... closables ) {
119126 Collections .addAll (this .preDestroyList , closables );
@@ -200,14 +207,14 @@ private boolean detectAvajeConfig() {
200207 try {
201208 Class .forName ("io.avaje.config.Configuration" , false , classLoader );
202209 return true ;
203- } catch (ClassNotFoundException e ) {
210+ } catch (final ClassNotFoundException e ) {
204211 return false ;
205212 }
206213 }
207214
208215 @ Override
209216 public BeanScope build () {
210- var start = System .currentTimeMillis ();
217+ final var start = System .currentTimeMillis ();
211218 // load and apply plugins first
212219 initClassLoader ();
213220 if (propertyRequiresPlugin == null ) {
@@ -216,12 +223,12 @@ public BeanScope build() {
216223
217224 ServiceLoader .load (Plugin .class , classLoader ).forEach (plugin -> plugin .apply (this ));
218225 // sort factories by dependsOn
219- FactoryOrder factoryOrder = new FactoryOrder (parent , includeModules , !suppliedBeans .isEmpty ());
226+ final FactoryOrder factoryOrder = new FactoryOrder (parent , includeModules , !suppliedBeans .isEmpty ());
220227 if (factoryOrder .isEmpty ()) {
221228 ServiceLoader .load (Module .class , classLoader ).forEach (factoryOrder ::add );
222229 }
223230
224- Set <String > moduleNames = factoryOrder .orderFactories ();
231+ final Set <String > moduleNames = factoryOrder .orderFactories ();
225232 if (moduleNames .isEmpty ()) {
226233 throw new IllegalStateException ("No modules found. When using java module system we need an explicit provides clause in module-info like:\n \n " +
227234 " provides io.avaje.inject.spi.Module with org.example.ExampleModule;\n \n " +
@@ -231,12 +238,13 @@ public BeanScope build() {
231238 }
232239 log .log (DEBUG , "building with modules {0}" , moduleNames );
233240
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 ()) {
236243 factory .build (builder );
237244 }
238245
239246 postConstructList .forEach (builder ::addPostConstruct );
247+ postConstructConsumerList .forEach (builder ::addPostConstruct );
240248 preDestroyList .forEach (builder ::addPreDestroy );
241249 return builder .build (shutdownHook , start );
242250 }
@@ -245,7 +253,7 @@ public BeanScope build() {
245253 * Return the type that we map the supplied bean to.
246254 */
247255 private static Class <?> superOf (Class <?> suppliedClass ) {
248- Class <?> suppliedSuper = suppliedClass .getSuperclass ();
256+ final Class <?> suppliedSuper = suppliedClass .getSuperclass ();
249257 if (Object .class .equals (suppliedSuper )) {
250258 return suppliedClass ;
251259 } else {
@@ -272,13 +280,13 @@ static class FactoryOrder {
272280 this .parent = parent ;
273281 this .factories .addAll (includeModules );
274282 this .suppliedBeans = suppliedBeans ;
275- for (Module includeModule : includeModules ) {
283+ for (final Module includeModule : includeModules ) {
276284 moduleNames .add (includeModule .getClass ().getName ());
277285 }
278286 }
279287
280288 void add (Module module ) {
281- FactoryState factoryState = new FactoryState (module );
289+ final FactoryState factoryState = new FactoryState (module );
282290 providesMap .computeIfAbsent (module .getClass ().getTypeName (), s -> new FactoryList ()).add (factoryState );
283291 addFactoryProvides (factoryState , module .provides ());
284292 addFactoryProvides (factoryState , module .autoProvides ());
@@ -299,7 +307,7 @@ void add(Module module) {
299307 }
300308
301309 private void addFactoryProvides (FactoryState factoryState , Class <?>[] provides ) {
302- for (Class <?> feature : provides ) {
310+ for (final Class <?> feature : provides ) {
303311 providesMap .computeIfAbsent (feature .getTypeName (), s -> new FactoryList ()).add (factoryState );
304312 }
305313 }
@@ -319,7 +327,7 @@ private void push(FactoryState factory) {
319327 Set <String > orderFactories () {
320328 // push the 'no dependency' modules after the 'provides only' ones
321329 // as this is more intuitive for the simple (only provides modules case)
322- for (FactoryState factoryState : queueNoDependencies ) {
330+ for (final FactoryState factoryState : queueNoDependencies ) {
323331 push (factoryState );
324332 }
325333 processQueue ();
@@ -345,12 +353,12 @@ private void processQueue() {
345353 if (suppliedBeans ) {
346354 // just push everything left assuming supplied beans
347355 // will satisfy the required dependencies
348- for (FactoryState factoryState : queue ) {
356+ for (final FactoryState factoryState : queue ) {
349357 push (factoryState );
350358 }
351359 } 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 ) {
354362 sb .append ("Module [" ).append (factory ).append ("] has unsatisfied" );
355363 unsatisfiedRequires (sb , factory .requires (), "requires" );
356364 unsatisfiedRequires (sb , factory .requiresPackages (), "requiresPackages" );
@@ -366,7 +374,7 @@ private void processQueue() {
366374 }
367375
368376 private void unsatisfiedRequires (StringBuilder sb , Class <?>[] requiredType , String requires ) {
369- for (Class <?> depModuleName : requiredType ) {
377+ for (final Class <?> depModuleName : requiredType ) {
370378 if (notProvided (depModuleName .getTypeName ())) {
371379 sb .append (String .format (" %s [%s]" , requires , depModuleName .getTypeName ()));
372380 }
@@ -377,7 +385,7 @@ private boolean notProvided(String dependency) {
377385 if (parent != null && parent .contains (dependency )) {
378386 return false ;
379387 }
380- FactoryList factories = providesMap .get (dependency );
388+ final FactoryList factories = providesMap .get (dependency );
381389 return (factories == null || !factories .allPushed ());
382390 }
383391
@@ -389,9 +397,9 @@ private boolean notProvided(String dependency) {
389397 */
390398 private int processQueuedFactories () {
391399 int count = 0 ;
392- Iterator <FactoryState > it = queue .iterator ();
400+ final Iterator <FactoryState > it = queue .iterator ();
393401 while (it .hasNext ()) {
394- FactoryState factory = it .next ();
402+ final FactoryState factory = it .next ();
395403 if (satisfiedDependencies (factory )) {
396404 // push the factory onto the build order
397405 it .remove ();
@@ -503,7 +511,7 @@ void add(FactoryState factory) {
503511 * Return true if all factories here have been pushed onto the build order.
504512 */
505513 boolean allPushed () {
506- for (FactoryState factory : factories ) {
514+ for (final FactoryState factory : factories ) {
507515 if (!factory .isPushed ()) {
508516 return false ;
509517 }
0 commit comments