@Override public <T> T getInstance(final String factoryName) { final Proxy<T> proxy = getOrCreateProxy(factoryName); if (proxy == null) { return getActiveNonProxiedInstance(factoryName); } else { return proxy.asBeanType(); } }
protected <T> T createNewUnproxiedInstance(final String factoryName) { final Factory<T> factory = this.<T>getFactory(factoryName); registerIncompleteInstance(factoryName); final T instance = factory.createInstance(getContextManager()); unregisterIncompleteInstance(factoryName, instance); registerInstance(instance, factory); factory.invokePostConstructs(instance); return instance; }
@Override public <T> T getActiveNonProxiedInstance(final String factoryName) { if (hasActiveInstance(factoryName)) { return getActiveInstance(factoryName); } else if (isCurrentlyCreatingActiveInstance(factoryName)) { final Factory<T> factory = this.<T>getFactory(factoryName); final T incomplete = factory.getIncompleteInstance(); if (incomplete == null) { throw new RuntimeException("Could not obtain an incomplete instance of " + factory.getHandle().getActualType().getName() + " to break a circular injection."); } else { logger.warn("An incomplete " + factory.getHandle().getActualType() + " was required to break a circular injection."); return incomplete; } } else { return createNewUnproxiedInstance(factoryName); } }
@SuppressWarnings({ "rawtypes", "unchecked" }) @Override public void destroyInstance(final Object instance) { if (isManaged(instance)) { beforeDestroyInstance(instance); final Object unwrapped = maybeUnwrap(instance); final Deque<Factory<?>> factories = factoriesByCreatedInstances.remove(unwrapped); while (factories != null && !factories.isEmpty()) { final Factory<?> factory = factories.pop(); for (final DestructionCallback callback : destructionCallbacksByInstance.removeAll(unwrapped)) { callback.destroy(unwrapped); } factory.destroyInstance(unwrapped, contextManager); } afterDestroyInstance(instance); } }
@Override public <T> T getNewInstance(final String factoryName) { final Factory<T> factory = getFactory(factoryName); final Proxy<T> proxy = factory.createProxy(this); final T instance = factory.createInstance(getContextManager()); if (proxy != null) { proxy.setInstance(instance); } factory.invokePostConstructs(instance); registerInstance(instance, factory); return (proxy != null) ? proxy.asBeanType() : instance; }
/** * @return Returns null if a proxy cannot be created. */ protected <T> Proxy<T> getOrCreateProxy(final String factoryName) { // TODO this will not work for @Dependent proxied beans. @SuppressWarnings("unchecked") Proxy<T> proxy = (Proxy<T>) proxies.get(factoryName); if (proxy == null) { final Factory<T> factory = getFactory(factoryName); proxy = factory.createProxy(this); if (proxy != null) { proxies.put(factoryName, proxy); } } return proxy; }