Class CloseAwareApplicationContext

  • All Implemented Interfaces:
    java.io.Closeable, java.lang.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

        CONFIG_LOCATION_DELIMITERS, CONVERSION_SERVICE_BEAN_NAME, ENVIRONMENT_BEAN_NAME, LOAD_TIME_WEAVER_BEAN_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
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      protected void doClose()
      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.
      java.lang.String toString()  
      • 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, registerBeanDefinition, removeAlias, removeBeanDefinition, setAllowBeanDefinitionOverriding, setAllowCircularReferences, setClassLoader, setParent, setResourceLoader
      • Methods inherited from class org.springframework.context.support.AbstractApplicationContext

        addApplicationListener, addBeanFactoryPostProcessor, assertBeanFactoryActive, close, containsBean, containsBeanDefinition, containsLocalBean, createEnvironment, destroy, destroyBeans, findAnnotationOnBean, finishBeanFactoryInitialization, finishRefresh, getAliases, getApplicationListeners, getApplicationName, getBean, getBean, getBean, getBean, getBean, getBeanDefinitionCount, getBeanDefinitionNames, getBeanFactoryPostProcessors, getBeanNamesForAnnotation, getBeanNamesForType, getBeanNamesForType, getBeanNamesForType, getBeanProvider, getBeanProvider, getBeansOfType, getBeansOfType, getBeansWithAnnotation, getDisplayName, getEnvironment, getId, getInternalParentBeanFactory, getInternalParentMessageSource, getMessage, getMessage, getMessage, getParent, getParentBeanFactory, getResourcePatternResolver, getStartupDate, 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 Detail

      • CloseAwareApplicationContext

        public CloseAwareApplicationContext​(java.lang.String name)
      • CloseAwareApplicationContext

        public CloseAwareApplicationContext​(java.lang.String uid,
                                            java.lang.String name)
    • Method Detail

      • 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 java.lang.String toString()
        Overrides:
        toString in class org.springframework.context.support.AbstractApplicationContext