@Override public void destroy(T instance, CreationalContext<T> creationalContext) { if (getScope().equals(Dependent.class) && creationalContext instanceof CreationalContextImpl && ((CreationalContextImpl<T>)creationalContext).containsDependent(this, instance)) { // we just have to call release, because release will destroy us since we are @Dependent creationalContext.release(); return; } try { Producer<T> producer = getProducer(); if (producer instanceof InjectionTarget) { InjectionTarget<T> injectionTarget = (InjectionTarget<T>)producer; injectionTarget.preDestroy(instance); } producer.dispose(instance); //Destroy dependent instances creationalContext.release(); } catch(Exception e) { getLogger().log(Level.SEVERE, WebBeansLoggerFacade.constructMessage(OWBLogConst.FATAL_0001, this), e); } }