I found a bug on my autowiring code. :-)
In case you provide an existing instance when installing bean metadata into Controller (Controller.install(bmd, myinstance)), that instance won't be part of matching contexts since the code that strips down the instance into its class, superclasses, interfaces, ... is in InstantiateAction.
And we skip that action when target already exists.
I'm thinking of adding something like
public class AutowireAction extends InstallsAwareAction { protected void installActionInternal(KernelControllerContext context) throws Throwable { KernelController controller = (KernelController)context.getController(); DependencyInfo dependencyInfo = context.getDependencyInfo(); if (dependencyInfo != null && dependencyInfo.isAutowireCandidate()) controller.addInstantiatedContext(context); } protected void uninstallActionInternal(KernelControllerContext context) { try { KernelController controller = (KernelController)context.getController(); DependencyInfo dependencyInfo = context.getDependencyInfo(); if (dependencyInfo != null && dependencyInfo.isAutowireCandidate()) controller.removeInstantiatedContext(context); } catch (Throwable ignored) { log.debug("Ignored error unsetting context ", ignored); } } protected ControllerState getState() { return ControllerState.INSTANTIATED; } protected Class<? extends KernelControllerContextAware> getActionAwareInterface() { return InstantiateKernelControllerContextAware.class; } }
actions.put(ControllerState.INSTANTIATED, new AutowireAction());