org.springframework.web.context.support

## 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, Aware, BeanFactory, BeanNameAware, HierarchicalBeanFactory, InitializingBean, ListableBeanFactory, AnnotationConfigRegistry, ApplicationContext, ApplicationEventPublisher, ConfigurableApplicationContext, Lifecycle, MessageSource, EnvironmentCapable, ResourceLoader, ResourcePatternResolver, ThemeSource, ConfigurableWebApplicationContext, WebApplicationContext

      public class AnnotationConfigWebApplicationContext
      extends AbstractRefreshableWebApplicationContext
      implements 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 `javax.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.

  As of Spring 3.1, 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:
    `AnnotationConfigApplicationContext`, `GenericWebApplicationContext`

- - ### Nested Class Summary

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

      `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.web.context.ConfigurableWebApplicationContext

      `APPLICATION_CONTEXT_ID_PREFIX, SERVLET_CONFIG_BEAN_NAME`

    - ### Fields inherited from interface org.springframework.web.context.WebApplicationContext

      `CONTEXT_ATTRIBUTES_BEAN_NAME, CONTEXT_PARAMETERS_BEAN_NAME, ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, SCOPE_APPLICATION, SCOPE_REQUEST, SCOPE_SESSION, SERVLET_CONTEXT_BEAN_NAME`

    - ### 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.beans.factory.BeanFactory

      `FACTORY_BEAN_PREFIX`

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

      `CLASSPATH_ALL_URL_PREFIX`

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

      `CLASSPATH_URL_PREFIX`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `AnnotationConfigWebApplicationContext()`

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `protected AnnotatedBeanDefinitionReader` | `getAnnotatedBeanDefinitionReader(DefaultListableBeanFactory beanFactory)` Build an `AnnotatedBeanDefinitionReader` for the given bean factory.
    `protected BeanNameGenerator` | `getBeanNameGenerator()` Return the custom `BeanNameGenerator` for use with `AnnotatedBeanDefinitionReader` and/or `ClassPathBeanDefinitionScanner`, if any.
    `protected ClassPathBeanDefinitionScanner` | `getClassPathBeanDefinitionScanner(DefaultListableBeanFactory beanFactory)` Build a `ClassPathBeanDefinitionScanner` for the given bean factory.
    `protected ScopeMetadataResolver` | `getScopeMetadataResolver()` Return the custom `ScopeMetadataResolver` for use with `AnnotatedBeanDefinitionReader` and/or `ClassPathBeanDefinitionScanner`, if any.
    `protected void` | `loadBeanDefinitions(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(BeanNameGenerator beanNameGenerator)` Set a custom `BeanNameGenerator` for use with `AnnotatedBeanDefinitionReader` and/or `ClassPathBeanDefinitionScanner`.
    `void` | `setScopeMetadataResolver(ScopeMetadataResolver scopeMetadataResolver)` Set a custom `ScopeMetadataResolver` for use with `AnnotatedBeanDefinitionReader` and/or `ClassPathBeanDefinitionScanner`.

    - ### Methods inherited from class org.springframework.web.context.support.AbstractRefreshableWebApplicationContext

      `createEnvironment, getApplicationName, getConfigLocations, getNamespace, getResourceByPath, getResourcePatternResolver, getServletConfig, getServletContext, getTheme, initPropertySources, onRefresh, postProcessBeanFactory, setNamespace, setServletConfig, setServletContext`

    - ### 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, destroy, destroyBeans, doClose, 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, 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.web.context.ConfigurableWebApplicationContext

      `setConfigLocation, setConfigLocations`

    - ### Methods inherited from interface org.springframework.context.ConfigurableApplicationContext

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

    - ### Methods inherited from interface org.springframework.context.ApplicationContext

      `getAutowireCapableBeanFactory, getDisplayName, getId, getParent, getStartupDate`

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

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

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

      `containsLocalBean, getParentBeanFactory`

    - ### 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.MessageSource

      `getMessage, getMessage, getMessage`

    - ### Methods inherited from interface org.springframework.context.ApplicationEventPublisher

      `publishEvent, publishEvent`

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

      `getResources`

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

      `getClassLoader, getResource`

    - ### Methods inherited from interface org.springframework.context.Lifecycle

      `isRunning, start, stop`

- - ### Constructor Detail

    - #### AnnotationConfigWebApplicationContext

          public AnnotationConfigWebApplicationContext()

  - ### Method Detail

    - #### setBeanNameGenerator

          public void setBeanNameGenerator(@Nullable
                                           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 BeanNameGenerator getBeanNameGenerator()

      Return the custom `BeanNameGenerator` for use with `AnnotatedBeanDefinitionReader` and/or `ClassPathBeanDefinitionScanner`, if any.

    - #### setScopeMetadataResolver

          public void setScopeMetadataResolver(@Nullable
                                               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 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 `AnnotationConfigRegistry`
      Parameters:
        `componentClasses` - one or more component classes, e.g. `@Configuration` classes
      See Also:
        `scan(String...)`, `loadBeanDefinitions(DefaultListableBeanFactory)`, `AbstractRefreshableConfigApplicationContext.setConfigLocation(String)`, `AbstractApplicationContext.refresh()`

    - #### 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 `AnnotationConfigRegistry`
      Parameters:
        `basePackages` - the packages to check for component classes
      See Also:
        `loadBeanDefinitions(DefaultListableBeanFactory)`, `register(Class...)`, `AbstractRefreshableConfigApplicationContext.setConfigLocation(String)`, `AbstractApplicationContext.refresh()`

    - #### loadBeanDefinitions

          protected void loadBeanDefinitions(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`, `@Required`, 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 `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 AnnotatedBeanDefinitionReader getAnnotatedBeanDefinitionReader(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:
        `AbstractApplicationContext.getEnvironment()`, `getBeanNameGenerator()`, `getScopeMetadataResolver()`

    - #### getClassPathBeanDefinitionScanner

          protected ClassPathBeanDefinitionScanner getClassPathBeanDefinitionScanner(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:
        `AbstractApplicationContext.getEnvironment()`, `getBeanNameGenerator()`, `getScopeMetadataResolver()`