Class AnnotationConfigWebApplicationContext

java.lang.Object
org.springframework.core.io.DefaultResourceLoader
org.springframework.context.support.AbstractApplicationContext
org.springframework.context.support.AbstractRefreshableApplicationContext
org.springframework.context.support.AbstractRefreshableConfigApplicationContext
org.springframework.web.context.support.AbstractRefreshableWebApplicationContext
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
All Implemented Interfaces:
Closeable, AutoCloseable, org.springframework.beans.factory.Aware, org.springframework.beans.factory.BeanFactory, org.springframework.beans.factory.BeanNameAware, org.springframework.beans.factory.HierarchicalBeanFactory, org.springframework.beans.factory.InitializingBean, org.springframework.beans.factory.ListableBeanFactory, org.springframework.context.annotation.AnnotationConfigRegistry, org.springframework.context.ApplicationContext, org.springframework.context.ApplicationEventPublisher, org.springframework.context.ConfigurableApplicationContext, org.springframework.context.Lifecycle, org.springframework.context.MessageSource, org.springframework.core.env.EnvironmentCapable, org.springframework.core.io.ResourceLoader, org.springframework.core.io.support.ResourcePatternResolver, org.springframework.ui.context.ThemeSource, ConfigurableWebApplicationContext, WebApplicationContext

public class AnnotationConfigWebApplicationContext extends AbstractRefreshableWebApplicationContext implements org.springframework.context.annotation.AnnotationConfigRegistry
WebApplicationContext implementation which accepts component classes as input — in particular @Configuration classes, but also plain @Component classes as well as JSR-330 compliant classes using jakarta.inject annotations.

Allows for registering classes one by one (specifying class names as config locations) as well as via classpath scanning (specifying base packages as config locations).

This is essentially the equivalent of AnnotationConfigApplicationContext for a web environment. However, in contrast to AnnotationConfigApplicationContext, this class does not extend GenericApplicationContext and therefore does not provide some of the convenient registerBean(...) methods available in a GenericApplicationContext. If you wish to register annotated component classes with a GenericApplicationContext in a web environment, you may use a GenericWebApplicationContext with an AnnotatedBeanDefinitionReader. See the Javadoc for GenericWebApplicationContext for details and an example.

To make use of this application context, the "contextClass" context-param for ContextLoader and/or "contextClass" init-param for FrameworkServlet must be set to the fully-qualified name of this class.

This class may also be directly instantiated and injected into Spring's DispatcherServlet or ContextLoaderListener when using the WebApplicationInitializer code-based alternative to web.xml. See its Javadoc for details and usage examples.

Unlike XmlWebApplicationContext, no default configuration class locations are assumed. Rather, it is a requirement to set the "contextConfigLocation" context-param for ContextLoader and/or "contextConfigLocation" init-param for FrameworkServlet. The param-value may contain both fully-qualified class names and base packages to scan for components. See loadBeanDefinitions(org.springframework.beans.factory.support.DefaultListableBeanFactory) for exact details on how these locations are processed.

As an alternative to setting the "contextConfigLocation" parameter, users may implement an ApplicationContextInitializer and set the "contextInitializerClasses" context-param / init-param. In such cases, users should favor the AbstractApplicationContext.refresh() and scan(String...) methods over the AbstractRefreshableConfigApplicationContext.setConfigLocation(String) method, which is primarily for use by ContextLoader.

Note: In case of multiple @Configuration classes, later @Bean definitions will override ones defined in earlier loaded files. This can be leveraged to deliberately override certain bean definitions via an extra @Configuration class.

Since:
3.0
Author:
Chris Beams, Juergen Hoeller, Sam Brannen
See Also:
  • 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.web.context.ConfigurableWebApplicationContext

    APPLICATION_CONTEXT_ID_PREFIX, SERVLET_CONFIG_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 org.springframework.context.annotation.AnnotatedBeanDefinitionReader
    getAnnotatedBeanDefinitionReader(org.springframework.beans.factory.support.DefaultListableBeanFactory beanFactory)
    Build an AnnotatedBeanDefinitionReader for the given bean factory.
    protected org.springframework.beans.factory.support.BeanNameGenerator
    Return the custom BeanNameGenerator for use with AnnotatedBeanDefinitionReader and/or ClassPathBeanDefinitionScanner, if any.
    protected org.springframework.context.annotation.ClassPathBeanDefinitionScanner
    getClassPathBeanDefinitionScanner(org.springframework.beans.factory.support.DefaultListableBeanFactory beanFactory)
    Build a ClassPathBeanDefinitionScanner for the given bean factory.
    protected org.springframework.context.annotation.ScopeMetadataResolver
    Return the custom ScopeMetadataResolver for use with AnnotatedBeanDefinitionReader and/or ClassPathBeanDefinitionScanner, if any.
    protected void
    loadBeanDefinitions(org.springframework.beans.factory.support.DefaultListableBeanFactory beanFactory)
    Register a BeanDefinition for any classes specified by register(Class...) and scan any packages specified by scan(String...).
    void
    register(Class<?>... componentClasses)
    Register one or more component classes to be processed.
    void
    scan(String... basePackages)
    Perform a scan within the specified base packages.
    void
    setBeanNameGenerator(org.springframework.beans.factory.support.BeanNameGenerator beanNameGenerator)
    Set a custom BeanNameGenerator for use with AnnotatedBeanDefinitionReader and/or ClassPathBeanDefinitionScanner.
    void
    setScopeMetadataResolver(org.springframework.context.annotation.ScopeMetadataResolver scopeMetadataResolver)
    Set a custom ScopeMetadataResolver for use with AnnotatedBeanDefinitionReader and/or ClassPathBeanDefinitionScanner.

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

    afterPropertiesSet, getDefaultConfigLocations, resolvePath, setBeanName, setConfigLocation, setConfigLocations, setId

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

    assertBeanFactoryActive, cancelRefresh, closeBeanFactory, createBeanFactory, customizeBeanFactory, getBeanFactory, hasBeanFactory, refreshBeanFactory, setAllowBeanDefinitionOverriding, setAllowCircularReferences

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

    addApplicationListener, addBeanFactoryPostProcessor, close, containsBean, containsBeanDefinition, containsLocalBean, destroyBeans, doClose, findAllAnnotationsOnBean, findAnnotationOnBean, findAnnotationOnBean, finishBeanFactoryInitialization, finishRefresh, getAliases, getApplicationListeners, getApplicationStartup, getAutowireCapableBeanFactory, 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, getResources, getStartupDate, getType, getType, initApplicationEventMulticaster, initLifecycleProcessor, initMessageSource, invokeBeanFactoryPostProcessors, isActive, isPrototype, isRunning, isSingleton, isTypeMatch, isTypeMatch, obtainFreshBeanFactory, onClose, prepareBeanFactory, prepareRefresh, publishEvent, publishEvent, publishEvent, refresh, registerBeanPostProcessors, registerListeners, registerShutdownHook, removeApplicationListener, resetCommonCaches, setApplicationStartup, setDisplayName, setEnvironment, setParent, start, stop, toString

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

    addProtocolResolver, clearResourceCaches, getClassLoader, getProtocolResolvers, getResource, getResourceCache, setClassLoader

    Methods inherited from class java.lang.Object

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

    Methods inherited from interface org.springframework.context.ApplicationContext

    getAutowireCapableBeanFactory, getDisplayName, getId, getParent, getStartupDate

    Methods inherited from interface org.springframework.context.ApplicationEventPublisher

    publishEvent, publishEvent

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

    containsBean, getAliases, getBean, getBean, getBean, getBean, getBean, getBeanProvider, getBeanProvider, getType, getType, isPrototype, isSingleton, isTypeMatch, isTypeMatch

    Methods inherited from interface org.springframework.context.ConfigurableApplicationContext

    addApplicationListener, addBeanFactoryPostProcessor, addProtocolResolver, close, getApplicationStartup, getBeanFactory, getEnvironment, isActive, refresh, registerShutdownHook, removeApplicationListener, setApplicationStartup, setClassLoader, setEnvironment, setId, setParent

    Methods inherited from interface org.springframework.web.context.ConfigurableWebApplicationContext

    setConfigLocation, setConfigLocations

    Methods inherited from interface org.springframework.beans.factory.HierarchicalBeanFactory

    containsLocalBean, getParentBeanFactory

    Methods inherited from interface org.springframework.context.Lifecycle

    isRunning, start, stop

    Methods inherited from interface org.springframework.beans.factory.ListableBeanFactory

    containsBeanDefinition, findAllAnnotationsOnBean, findAnnotationOnBean, findAnnotationOnBean, getBeanDefinitionCount, getBeanDefinitionNames, getBeanNamesForAnnotation, getBeanNamesForType, getBeanNamesForType, getBeanNamesForType, getBeanNamesForType, getBeanProvider, getBeanProvider, getBeansOfType, getBeansOfType, getBeansWithAnnotation

    Methods inherited from interface org.springframework.context.MessageSource

    getMessage, getMessage, getMessage

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

    getClassLoader, getResource

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

    getResources
  • Constructor Details

    • AnnotationConfigWebApplicationContext

      public AnnotationConfigWebApplicationContext()
  • Method Details

    • setBeanNameGenerator

      public void setBeanNameGenerator(@Nullable org.springframework.beans.factory.support.BeanNameGenerator beanNameGenerator)
      Set a custom BeanNameGenerator for use with AnnotatedBeanDefinitionReader and/or ClassPathBeanDefinitionScanner.

      Default is AnnotationBeanNameGenerator.

      See Also:
      • AnnotatedBeanDefinitionReader.setBeanNameGenerator(org.springframework.beans.factory.support.BeanNameGenerator)
      • ClassPathBeanDefinitionScanner.setBeanNameGenerator(org.springframework.beans.factory.support.BeanNameGenerator)
    • getBeanNameGenerator

      @Nullable protected org.springframework.beans.factory.support.BeanNameGenerator getBeanNameGenerator()
      Return the custom BeanNameGenerator for use with AnnotatedBeanDefinitionReader and/or ClassPathBeanDefinitionScanner, if any.
    • setScopeMetadataResolver

      public void setScopeMetadataResolver(@Nullable org.springframework.context.annotation.ScopeMetadataResolver scopeMetadataResolver)
      Set a custom ScopeMetadataResolver for use with AnnotatedBeanDefinitionReader and/or ClassPathBeanDefinitionScanner.

      Default is an AnnotationScopeMetadataResolver.

      See Also:
      • AnnotatedBeanDefinitionReader.setScopeMetadataResolver(org.springframework.context.annotation.ScopeMetadataResolver)
      • ClassPathBeanDefinitionScanner.setScopeMetadataResolver(org.springframework.context.annotation.ScopeMetadataResolver)
    • getScopeMetadataResolver

      @Nullable protected org.springframework.context.annotation.ScopeMetadataResolver getScopeMetadataResolver()
      Return the custom ScopeMetadataResolver for use with AnnotatedBeanDefinitionReader and/or ClassPathBeanDefinitionScanner, if any.
    • register

      public void register(Class<?>... componentClasses)
      Register one or more component classes to be processed.

      Note that AbstractApplicationContext.refresh() must be called in order for the context to fully process the new classes.

      Specified by:
      register in interface org.springframework.context.annotation.AnnotationConfigRegistry
      Parameters:
      componentClasses - one or more component classes, e.g. @Configuration classes
      See Also:
    • scan

      public void scan(String... basePackages)
      Perform a scan within the specified base packages.

      Note that AbstractApplicationContext.refresh() must be called in order for the context to fully process the new classes.

      Specified by:
      scan in interface org.springframework.context.annotation.AnnotationConfigRegistry
      Parameters:
      basePackages - the packages to check for component classes
      See Also:
    • loadBeanDefinitions

      protected void loadBeanDefinitions(org.springframework.beans.factory.support.DefaultListableBeanFactory beanFactory)
      Register a BeanDefinition for any classes specified by register(Class...) and scan any packages specified by scan(String...).

      For any values specified by AbstractRefreshableConfigApplicationContext.setConfigLocation(String) or AbstractRefreshableConfigApplicationContext.setConfigLocations(String[]), attempt first to load each location as a class, registering a BeanDefinition if class loading is successful, and if class loading fails (i.e. a ClassNotFoundException is raised), assume the value is a package and attempt to scan it for component classes.

      Enables the default set of annotation configuration post processors, such that @Autowired and associated annotations can be used.

      Configuration class bean definitions are registered with generated bean definition names unless the value attribute is provided to the stereotype annotation.

      Specified by:
      loadBeanDefinitions in class org.springframework.context.support.AbstractRefreshableApplicationContext
      Parameters:
      beanFactory - the bean factory to load bean definitions into
      See Also:
      • register(Class...)
      • scan(String...)
      • AbstractRefreshableConfigApplicationContext.setConfigLocation(String)
      • AbstractRefreshableConfigApplicationContext.setConfigLocations(String[])
      • AnnotatedBeanDefinitionReader
      • ClassPathBeanDefinitionScanner
    • getAnnotatedBeanDefinitionReader

      protected org.springframework.context.annotation.AnnotatedBeanDefinitionReader getAnnotatedBeanDefinitionReader(org.springframework.beans.factory.support.DefaultListableBeanFactory beanFactory)
      Build an AnnotatedBeanDefinitionReader for the given bean factory.

      This should be pre-configured with the Environment (if desired) but not with a BeanNameGenerator or ScopeMetadataResolver yet.

      Parameters:
      beanFactory - the bean factory to load bean definitions into
      Since:
      4.1.9
      See Also:
    • getClassPathBeanDefinitionScanner

      protected org.springframework.context.annotation.ClassPathBeanDefinitionScanner getClassPathBeanDefinitionScanner(org.springframework.beans.factory.support.DefaultListableBeanFactory beanFactory)
      Build a ClassPathBeanDefinitionScanner for the given bean factory.

      This should be pre-configured with the Environment (if desired) but not with a BeanNameGenerator or ScopeMetadataResolver yet.

      Parameters:
      beanFactory - the bean factory to load bean definitions into
      Since:
      4.1.9
      See Also: