@Override public void configure() { requireBinding(CloseableInjector.class); MyJsr250Destroyer destroyer = new MyJsr250Destroyer(); requestInjection(destroyer); bind(MyJsr250Destroyer.class).toInstance(destroyer); bind(Jsr250KeyProvider.class).in(Singleton.class); bind(Jsr250PostConstructHandler.class).in(Singleton.class); bind(new TypeLiteral<MethodHandler<PreDestroy>>() { }).to(Jsr250PreDestroyHandler.class).in(Singleton.class); MBinder.wrap(binder()) .bindAnnotationInjector(Resource.class, Jsr250KeyProvider.class) .handleMethodAfterInjection(PostConstruct.class, Jsr250PostConstructHandler.class); }
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 protected void configure() { // Components aren't available yet if (Boolean.valueOf(SystemProperty.getProperty("magnolia.jsr250.enabled", "true"))) { // JSR-250 support added by Mycila install(new Jsr250Module()); } install(new GuiceComponentConfigurationModule(configuration)); for (Module extraModule : extraModules) { binder().install(extraModule); } install(new CloseableModule()); } };
@Override public void configure() { requireBinding(CloseableInjector.class); MyJsr250Destroyer destroyer = new MyJsr250Destroyer(); requestInjection(destroyer); bind(MyJsr250Destroyer.class).toInstance(destroyer); bind(Jsr250KeyProvider.class).in(Singleton.class); bind(Jsr250PostConstructHandler.class).in(Singleton.class); bind(new TypeLiteral<MethodHandler<PreDestroy>>() { }).to(Jsr250PreDestroyHandler.class).in(Singleton.class); MBinder.wrap(binder()) .bindAnnotationInjector(Resource.class, Jsr250KeyProvider.class) .handleMethodAfterInjection(PostConstruct.class, Jsr250PostConstructHandler.class); }
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); }