org.springframework.web.context.support
Class AnnotationConfigWebApplicationContext

java.lang.Object
  extended by org.springframework.core.io.DefaultResourceLoader
      extended by org.springframework.context.support.AbstractApplicationContext
          extended by org.springframework.context.support.AbstractRefreshableApplicationContext
              extended by org.springframework.context.support.AbstractRefreshableConfigApplicationContext
                  extended by org.springframework.web.context.support.AbstractRefreshableWebApplicationContext
                      extended by org.springframework.web.context.support.AnnotationConfigWebApplicationContext
All Implemented Interfaces:
Aware, BeanFactory, BeanNameAware, DisposableBean, HierarchicalBeanFactory, InitializingBean, ListableBeanFactory, AnnotationConfigCapableApplicationContext, ApplicationContext, ApplicationEventPublisher, ConfigurableApplicationContext, Lifecycle, MessageSource, EnvironmentCapable, ResourceLoader, ResourcePatternResolver, ThemeSource, ConfigurableWebApplicationContext, WebApplicationContext

public class AnnotationConfigWebApplicationContext
extends AbstractRefreshableWebApplicationContext
implements AnnotationConfigCapableApplicationContext

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:
AnnotationConfigCapableApplicationContext, 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.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
 
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
 
Constructor Summary
AnnotationConfigWebApplicationContext()
           
 
Method Summary
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)
          Set the BeanNameGenerator to use for detected bean classes.
 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, 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 ConfigurableApplicationContext.refresh() must be called in order for the context to fully process the new class.

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

Specified by:
register in interface AnnotationConfigCapableApplicationContext
Parameters:
annotatedClasses - one or more annotated classes, e.g. @Configuration classes
See Also:
loadBeanDefinitions(DefaultListableBeanFactory), register(Class...), setConfigLocation(String), AbstractApplicationContext.refresh()

scan

public void scan(String... basePackages)
Perform a scan within the specified base packages. Note that ConfigurableApplicationContext.refresh() must be called in order for the context to fully process the new class.

Specified by:
scan in interface AnnotationConfigCapableApplicationContext
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(), #setConfigLocations(), AnnotatedBeanDefinitionReader, ClassPathBeanDefinitionScanner

setBeanNameGenerator

public void setBeanNameGenerator(BeanNameGenerator beanNameGenerator)
Description copied from interface: AnnotationConfigCapableApplicationContext
Set the BeanNameGenerator to use for detected bean classes.

The default is an AnnotationBeanNameGenerator.

Specified by:
setBeanNameGenerator in interface AnnotationConfigCapableApplicationContext

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)
Description copied from interface: AnnotationConfigCapableApplicationContext
Set the ScopeMetadataResolver to use for detected bean classes.

The default is an AnnotationScopeMetadataResolver.

Specified by:
setScopeMetadataResolver in interface AnnotationConfigCapableApplicationContext

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)