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 `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
  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()` Return the custom `BeanNameGenerator` for use with `AnnotatedBeanDefinitionReader` and/or `ClassPathBeanDefinitionScanner`, if any.
    `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<?>... 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)` 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

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

      `setConfigLocation, setConfigLocations`

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

    - #### setBeanNameGenerator

          public void setBeanNameGenerator(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

          protected BeanNameGenerator getBeanNameGenerator()

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

    - #### setScopeMetadataResolver

          public void setScopeMetadataResolver(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

          protected ScopeMetadataResolver getScopeMetadataResolver()

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

    - #### 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` 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)`, `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 class.
      Parameters:
        `basePackages` - the packages to check for annotated 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 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...)`, `AbstractRefreshableConfigApplicationContext.setConfigLocation(String)`, `AbstractRefreshableConfigApplicationContext.setConfigLocations(String[])`, `AnnotatedBeanDefinitionReader`, `ClassPathBeanDefinitionScanner`