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, DisposableBean, HierarchicalBeanFactory, InitializingBean, ListableBeanFactory, ApplicationContext, ApplicationEventPublisher, ConfigurableApplicationContext, Lifecycle, MessageSource, EnvironmentCapable, ResourceLoader, ResourcePatternResolver, ThemeSource, ConfigurableWebApplicationContext, WebApplicationContext

      public class AnnotationConfigWebApplicationContext
      extends AbstractRefreshableWebApplicationContext

  `WebApplicationContext` implementation which accepts annotated classes as input - in particular `@Configuration`-annotated classes, but also plain `@Component` classes and JSR-330 compliant classes using `javax.inject` annotations. Allows for registering classes one by one (specifying class names as config location) as well as for classpath scanning (specifying base packages as config location).

  This is essentially the equivalent of `AnnotationConfigApplicationContext` for a web environment.

  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 new `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 `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
  See Also:
    `AnnotationConfigApplicationContext`

- - ### 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_GLOBAL_SESSION, SCOPE_REQUEST, SCOPE_SESSION, SERVLET_CONTEXT_BEAN_NAME`

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

    Methods
    Modifier and Type | Method and Description
    --- | ---
    `protected BeanNameGenerator` | `getBeanNameGenerator()` Provide a custom `BeanNameGenerator` for use with `AnnotatedBeanDefinitionReader` and/or `ClassPathBeanDefinitionScanner`, if any.
    `protected ScopeMetadataResolver` | `getScopeMetadataResolver()` Provide a 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<?>... annotatedClasses)` Register one or more annotated classes to be processed.
    `void` | `scan(String... basePackages)` Perform a scan within the specified base packages.
    `void` | `setBeanNameGenerator(BeanNameGenerator beanNameGenerator)`
    `void` | `setConfigLocation(String location)` Set the config locations for this application context in init-param style, i.e.
    `void` | `setConfigLocations(String[] locations)` Set the config locations for this application context.
    `void` | `setScopeMetadataResolver(ScopeMetadataResolver scopeMetadataResolver)` Set the `ScopeMetadataResolver` to use for detected bean classes.

    - ### 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, setId`

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

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

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

      `addApplicationListener, addBeanFactoryPostProcessor, addListener, close, containsBean, containsBeanDefinition, containsLocalBean, destroy, destroyBeans, doClose, findAnnotationOnBean, finishBeanFactoryInitialization, finishRefresh, getAliases, getApplicationListeners, getAutowireCapableBeanFactory, getBean, getBean, getBean, getBean, getBeanDefinitionCount, getBeanDefinitionNames, getBeanFactoryPostProcessors, getBeanNamesForType, getBeanNamesForType, getBeansOfType, getBeansOfType, getBeansWithAnnotation, getDisplayName, getEnvironment, getId, getInternalParentBeanFactory, getInternalParentMessageSource, getMessage, getMessage, getMessage, getParent, getParentBeanFactory, getResources, getStartupDate, getType, initApplicationEventMulticaster, initLifecycleProcessor, initMessageSource, invokeBeanFactoryPostProcessors, isActive, isPrototype, isRunning, isSingleton, isTypeMatch, obtainFreshBeanFactory, onClose, prepareBeanFactory, prepareRefresh, publishEvent, refresh, registerBeanPostProcessors, registerListeners, registerShutdownHook, setDisplayName, setEnvironment, setParent, start, stop, toString`

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

      `getClassLoader, getResource, 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.ConfigurableApplicationContext

      `addApplicationListener, addBeanFactoryPostProcessor, close, getBeanFactory, getEnvironment, isActive, refresh, registerShutdownHook, 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, getBeanDefinitionCount, getBeanDefinitionNames, getBeanNamesForType, getBeanNamesForType, 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, getType, isPrototype, isSingleton, isTypeMatch`

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

      `getMessage, getMessage, getMessage`

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

      `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

    - #### setConfigLocation

          public void setConfigLocation(String location)

      Set the config locations for this application context in init-param style, i.e. with distinct locations separated by commas, semicolons or whitespace.

      If not set, the implementation may use a default as appropriate.

      This implementation accepts delimited values in the form of fully-qualified class names, (typically of `Configuration` classes) or fully-qualified packages to scan for annotated classes. During `loadBeanDefinitions(org.springframework.beans.factory.support.DefaultListableBeanFactory)`, these locations will be processed in their given order, first attempting to load each value as a class. If class loading fails (i.e. a `ClassNotFoundException` occurs), the value is assumed to be a package and scanning is attempted.

      Note that this method exists primarily for compatibility with Spring's `ContextLoader` and that if this application context is being configured through an `ApplicationContextInitializer`, use of the `register(java.lang.Class<?>...)` and `scan(java.lang.String...)` methods are preferred.

      Specified by:
        `setConfigLocation` in interface `ConfigurableWebApplicationContext`
      Overrides:
        `setConfigLocation` in class `AbstractRefreshableConfigApplicationContext`
      See Also:
        `register(Class...)`, `scan(String...)`, `setConfigLocations(String[])`, `loadBeanDefinitions(DefaultListableBeanFactory)`

    - #### setConfigLocations

          public void setConfigLocations(String[] locations)

      Set the config locations for this application context.

      If not set, the implementation may use a default as appropriate.

      This implementation accepts individual location values as fully-qualified class names (typically `@Configuration` classes) or fully-qualified packages to scan. During `loadBeanDefinitions(org.springframework.beans.factory.support.DefaultListableBeanFactory)`, these locations will be processed in order, first attempting to load values as a class, and upon class loading failure the value is assumed to be a package to be scanned.

      Note that this method exists primarily for compatibility with Spring's `ContextLoader` and that if this application context is being configured through an `ApplicationContextInitializer`, use of the `register(java.lang.Class<?>...)` and `scan(java.lang.String...)` methods are preferred.

      Specified by:
        `setConfigLocations` in interface `ConfigurableWebApplicationContext`
      Overrides:
        `setConfigLocations` in class `AbstractRefreshableConfigApplicationContext`
      See Also:
        `scan(String...)`, `register(Class...)`, `setConfigLocation(String)`, `loadBeanDefinitions(DefaultListableBeanFactory)`

    - #### register

          public void register(Class<?>... annotatedClasses)

      Register one or more annotated classes to be processed. Note that `AbstractApplicationContext.refresh()` must be called in order for the context to fully process the new class.

      Calls to `register(java.lang.Class<?>...)` are idempotent; adding the same annotated class more than once has no additional effect.

      Parameters:
        `annotatedClasses` - one or more annotated classes, e.g. `@Configuration` classes
      See Also:
        `scan(String...)`, `loadBeanDefinitions(DefaultListableBeanFactory)`, `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 class.
      Parameters:
        `basePackages` - the packages to check for annotated classes
      See Also:
        `loadBeanDefinitions(DefaultListableBeanFactory)`, `register(Class...)`, `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 `setConfigLocation(String)` or `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 annotated 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...)`, `setConfigLocation(String)`, `setConfigLocations(String[])`, `AnnotatedBeanDefinitionReader`, `ClassPathBeanDefinitionScanner`

    - #### setBeanNameGenerator

          public void setBeanNameGenerator(BeanNameGenerator beanNameGenerator)

    - #### getBeanNameGenerator

          protected BeanNameGenerator getBeanNameGenerator()

      Provide a custom `BeanNameGenerator` for use with `AnnotatedBeanDefinitionReader` and/or `ClassPathBeanDefinitionScanner`, if any.

      Default is `AnnotationBeanNameGenerator`.

      See Also:
        `AnnotatedBeanDefinitionReader.setBeanNameGenerator(org.springframework.beans.factory.support.BeanNameGenerator)`, `ClassPathBeanDefinitionScanner.setBeanNameGenerator(org.springframework.beans.factory.support.BeanNameGenerator)`

    - #### setScopeMetadataResolver

          public void setScopeMetadataResolver(ScopeMetadataResolver scopeMetadataResolver)

      Set the `ScopeMetadataResolver` to use for detected bean classes.

      The default is an `AnnotationScopeMetadataResolver`.

    - #### getScopeMetadataResolver

          protected ScopeMetadataResolver getScopeMetadataResolver()

      Provide a custom `ScopeMetadataResolver` for use with `AnnotatedBeanDefinitionReader` and/or `ClassPathBeanDefinitionScanner`, if any.

      Default is `AnnotationScopeMetadataResolver`.

      See Also:
        `AnnotatedBeanDefinitionReader.setScopeMetadataResolver(org.springframework.context.annotation.ScopeMetadataResolver)`, `ClassPathBeanDefinitionScanner.setScopeMetadataResolver(org.springframework.context.annotation.ScopeMetadataResolver)`