@@ -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