private void close(Binding<?> binding, Map<Object, Object> done, Multimap<Binding<?>, Binding<?>> dependants) { if (!done.containsKey(binding)) { done.put(binding, Void.TYPE); for (Binding<?> dependant : dependants.get(binding)) { close(dependant, done, dependants); } try { if (binding instanceof ProviderInstanceBinding<?>) { Object o = ((ProviderInstanceBinding) binding).getProviderInstance(); if (!done.containsKey(o)) { preDestroy(o); done.put(o, Void.TYPE); } } else if (Scopes.isSingleton(binding)) { Object o = binding.getProvider().get(); if (!done.containsKey(o)) { preDestroy(o); done.put(o, Void.TYPE); } } } catch (Exception e) { // just ignore close errors } } }
private void close(Binding<?> binding, Map<Object, Object> done, Multimap<Binding<?>, Binding<?>> dependants) { if (!done.containsKey(binding)) { done.put(binding, Void.TYPE); for (Binding<?> dependant : dependants.get(binding)) { close(dependant, done, dependants); } try { if (binding instanceof ProviderInstanceBinding<?>) { Object o = ((ProviderInstanceBinding) binding).getProviderInstance(); if (!done.containsKey(o)) { preDestroy(o); done.put(o, Void.TYPE); } } else if (Scopes.isSingleton(binding)) { Object o = binding.getProvider().get(); if (!done.containsKey(o)) { preDestroy(o); done.put(o, Void.TYPE); } } } catch (Exception e) { // just ignore close errors } } }
@Override public void onInjectorClosing() { Map<Key<?>, Binding<?>> bindings = injector.getAllBindings(); Multimap<Binding<?>, Binding<?>> dependants = Multimaps.newSetMultimap(new IdentityHashMap<Binding<?>, Collection<Binding<?>>>(), new Supplier<Set<Binding<?>>>() { @Override public Set<Binding<?>> get() { return new HashSet<Binding<?>>(); } }); for (Binding<?> binding : bindings.values()) { if (binding instanceof HasDependencies) { for (Dependency<?> dependency : ((HasDependencies) binding).getDependencies()) { if (bindings.containsKey(dependency.getKey())) { dependants.put(injector.getBinding(dependency.getKey()), binding); } } } } Map<Object, Object> done = new IdentityHashMap<Object, Object>(bindings.size()); for (final Binding<?> binding : bindings.values()) if (Scopes.isSingleton(binding)) { close(binding, done, dependants); } for (Scope scope : injector.getScopeBindings().values()) preDestroy(scope); }
@Override public void onInjectorClosing() { Map<Key<?>, Binding<?>> bindings = injector.getAllBindings(); Multimap<Binding<?>, Binding<?>> dependants = Multimaps.newSetMultimap(new IdentityHashMap<Binding<?>, Collection<Binding<?>>>(), new Supplier<Set<Binding<?>>>() { @Override public Set<Binding<?>> get() { return new HashSet<Binding<?>>(); } }); for (Binding<?> binding : bindings.values()) { if (binding instanceof HasDependencies) { for (Dependency<?> dependency : ((HasDependencies) binding).getDependencies()) { if (bindings.containsKey(dependency.getKey())) { dependants.put(injector.getBinding(dependency.getKey()), binding); } } } } Map<Object, Object> done = new IdentityHashMap<Object, Object>(bindings.size()); for (final Binding<?> binding : bindings.values()) if (Scopes.isSingleton(binding)) { close(binding, done, dependants); } for (Scope scope : injector.getScopeBindings().values()) preDestroy(scope); }