Class CloseAwareApplicationContext

java.lang.Object
org.springframework.core.io.DefaultResourceLoader
org.springframework.context.support.AbstractApplicationContext
org.springframework.context.support.GenericApplicationContext
de.hybris.platform.spring.ctx.CloseAwareApplicationContext
All Implemented Interfaces:
Closeable, AutoCloseable, org.springframework.beans.factory.BeanFactory, org.springframework.beans.factory.HierarchicalBeanFactory, org.springframework.beans.factory.ListableBeanFactory, org.springframework.beans.factory.support.BeanDefinitionRegistry, org.springframework.context.ApplicationContext, org.springframework.context.ApplicationEventPublisher, org.springframework.context.ConfigurableApplicationContext, org.springframework.context.Lifecycle, org.springframework.context.MessageSource, org.springframework.core.AliasRegistry, org.springframework.core.env.EnvironmentCapable, org.springframework.core.io.ResourceLoader, org.springframework.core.io.support.ResourcePatternResolver

public class CloseAwareApplicationContext extends org.springframework.context.support.GenericApplicationContext
This class has been built with very basic thread safety constructs. For our purposes the best solution would really be ReentrantReadWriteLock, but we decided not to use it due to a bug with ThreadLocal storage (Bug ID: 6625723) None of the other built-in java classes/constructs was really suitable here...
  • Nested Class Summary

    Nested classes/interfaces inherited from class org.springframework.core.io.DefaultResourceLoader

    org.springframework.core.io.DefaultResourceLoader.ClassPathContextResource
  • Field Summary

    Fields inherited from class org.springframework.context.support.AbstractApplicationContext

    APPLICATION_EVENT_MULTICASTER_BEAN_NAME, LIFECYCLE_PROCESSOR_BEAN_NAME, logger, MESSAGE_SOURCE_BEAN_NAME

    Fields inherited from interface org.springframework.beans.factory.BeanFactory

    FACTORY_BEAN_PREFIX

    Fields inherited from interface org.springframework.context.ConfigurableApplicationContext

    APPLICATION_STARTUP_BEAN_NAME, CONFIG_LOCATION_DELIMITERS, CONVERSION_SERVICE_BEAN_NAME, ENVIRONMENT_BEAN_NAME, LOAD_TIME_WEAVER_BEAN_NAME, SHUTDOWN_HOOK_THREAD_NAME, SYSTEM_ENVIRONMENT_BEAN_NAME, SYSTEM_PROPERTIES_BEAN_NAME

    Fields inherited from interface org.springframework.core.io.ResourceLoader

    CLASSPATH_URL_PREFIX

    Fields inherited from interface org.springframework.core.io.support.ResourcePatternResolver

    CLASSPATH_ALL_URL_PREFIX
  • Constructor Summary

    Constructors
    Constructor
    Description
     
     
  • Method Summary

    Modifier and Type
    Method
    Description
    protected void
    Custom implementation that tries to solve our problems with event dispatching from multiple threads when the context is closing.
    void
    publishEvent(org.springframework.context.ApplicationEvent event)
    We do not allow to dispatch events once the closing is in progress.
     

    Methods inherited from class org.springframework.context.support.GenericApplicationContext

    cancelRefresh, closeBeanFactory, getAutowireCapableBeanFactory, getBeanDefinition, getBeanFactory, getClassLoader, getDefaultListableBeanFactory, getResource, getResources, isAlias, isBeanNameInUse, refreshBeanFactory, registerAlias, registerBean, registerBean, registerBean, registerBean, registerBean, registerBean, registerBeanDefinition, removeAlias, removeBeanDefinition, setAllowBeanDefinitionOverriding, setAllowCircularReferences, setApplicationStartup, setClassLoader, setParent, setResourceLoader

    Methods inherited from class org.springframework.context.support.AbstractApplicationContext

    addApplicationListener, addBeanFactoryPostProcessor, assertBeanFactoryActive, close, containsBean, containsBeanDefinition, containsLocalBean, createEnvironment, destroy, destroyBeans, findAnnotationOnBean, findAnnotationOnBean, finishBeanFactoryInitialization, finishRefresh, getAliases, getApplicationListeners, getApplicationName, getApplicationStartup, getBean, getBean, getBean, getBean, getBean, getBeanDefinitionCount, getBeanDefinitionNames, getBeanFactoryPostProcessors, getBeanNamesForAnnotation, getBeanNamesForType, getBeanNamesForType, getBeanNamesForType, getBeanNamesForType, getBeanProvider, getBeanProvider, getBeanProvider, getBeanProvider, getBeansOfType, getBeansOfType, getBeansWithAnnotation, getDisplayName, getEnvironment, getId, getInternalParentBeanFactory, getInternalParentMessageSource, getMessage, getMessage, getMessage, getParent, getParentBeanFactory, getResourcePatternResolver, getStartupDate, getType, getType, initApplicationEventMulticaster, initLifecycleProcessor, initMessageSource, initPropertySources, invokeBeanFactoryPostProcessors, isActive, isPrototype, isRunning, isSingleton, isTypeMatch, isTypeMatch, obtainFreshBeanFactory, onClose, onRefresh, postProcessBeanFactory, prepareBeanFactory, prepareRefresh, publishEvent, publishEvent, refresh, registerBeanPostProcessors, registerListeners, registerShutdownHook, resetCommonCaches, setDisplayName, setEnvironment, setId, start, stop

    Methods inherited from class org.springframework.core.io.DefaultResourceLoader

    addProtocolResolver, clearResourceCaches, getProtocolResolvers, getResourceByPath, getResourceCache

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

    Methods inherited from interface org.springframework.core.AliasRegistry

    getAliases

    Methods inherited from interface org.springframework.beans.factory.support.BeanDefinitionRegistry

    containsBeanDefinition, getBeanDefinitionCount, getBeanDefinitionNames

    Methods inherited from interface org.springframework.context.ConfigurableApplicationContext

    addProtocolResolver
  • Constructor Details

    • CloseAwareApplicationContext

      public CloseAwareApplicationContext(String name)
    • CloseAwareApplicationContext

      public CloseAwareApplicationContext(String uid, String name)
  • Method Details

    • publishEvent

      public void publishEvent(org.springframework.context.ApplicationEvent event)
      We do not allow to dispatch events once the closing is in progress.
      Specified by:
      publishEvent in interface org.springframework.context.ApplicationEventPublisher
      Overrides:
      publishEvent in class org.springframework.context.support.AbstractApplicationContext
    • doClose

      protected void doClose()
      Custom implementation that tries to solve our problems with event dispatching from multiple threads when the context is closing. This method first sets "isClosing" flag to prevent any other threads from trying to start publishing events. But there might be some threads that already execute publishEvent(ApplicationEvent) method. We do not want to close Spring Context immediately then, since this might lead to different Spring-related errors. What we do: When there are any such threads, we wait for them to finish. If the threads won't finish pending calls within given timeout, we continue with closing. The timeout value is fixed as TIMEOUT_LOOP_COUNT * SLEEP_TIME milliseconds.
      Overrides:
      doClose in class org.springframework.context.support.AbstractApplicationContext
    • toString

      public String toString()
      Overrides:
      toString in class org.springframework.context.support.AbstractApplicationContext