Package 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`, `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:
  - `AnnotationConfigApplicationContext`
  - `GenericWebApplicationContext`

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

### Fields inherited from interface org.springframework.context.ConfigurableApplicationContext

`APPLICATION_STARTUP_BEAN_NAME, BOOTSTRAP_EXECUTOR_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`

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

## Constructor Summary

Constructors
Constructor
Description
`AnnotationConfigWebApplicationContext()`

## 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`
`getBeanNameGenerator()`
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`
`getScopeMetadataResolver()`
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.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, clearResourceCaches, 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, isClosed, 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, 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, isClosed, 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, for example, `@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 `org.springframework.context.annotation.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(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:
  - `AbstractApplicationContext.getEnvironment()`
  - `getBeanNameGenerator()`
  - `getScopeMetadataResolver()`

### 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:
  - `AbstractApplicationContext.getEnvironment()`
  - `getBeanNameGenerator()`
  - `getScopeMetadataResolver()`