Introduce alias for 'value' attribute in @Scope
Issue: SPR-11393
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2013 the original author or authors.
|
||||
* Copyright 2002-2015 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -25,13 +25,14 @@ import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
* A {@link ScopeMetadataResolver} implementation that by default checks for
|
||||
* the presence of Spring's {@link Scope} annotation on the bean class.
|
||||
* the presence of Spring's {@link Scope @Scope} annotation on the bean class.
|
||||
*
|
||||
* <p>The exact type of annotation that is checked for is configurable via the
|
||||
* {@link #setScopeAnnotationType(Class)} property.
|
||||
* <p>The exact type of annotation that is checked for is configurable via
|
||||
* {@link #setScopeAnnotationType(Class)}.
|
||||
*
|
||||
* @author Mark Fisher
|
||||
* @author Juergen Hoeller
|
||||
* @author Sam Brannen
|
||||
* @since 2.5
|
||||
* @see org.springframework.context.annotation.Scope
|
||||
*/
|
||||
@@ -43,27 +44,27 @@ public class AnnotationScopeMetadataResolver implements ScopeMetadataResolver {
|
||||
|
||||
|
||||
/**
|
||||
* Create a new instance of the {@code AnnotationScopeMetadataResolver} class.
|
||||
* Construct a new {@code AnnotationScopeMetadataResolver}.
|
||||
* @see #AnnotationScopeMetadataResolver(ScopedProxyMode)
|
||||
* @see ScopedProxyMode#NO
|
||||
*/
|
||||
public AnnotationScopeMetadataResolver() {
|
||||
this.defaultProxyMode = ScopedProxyMode.NO;
|
||||
this(ScopedProxyMode.NO);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new instance of the {@code AnnotationScopeMetadataResolver} class.
|
||||
* @param defaultProxyMode the desired scoped-proxy mode
|
||||
* Construct a new {@code AnnotationScopeMetadataResolver} using the
|
||||
* supplied default {@link ScopedProxyMode}.
|
||||
* @param defaultProxyMode the default scoped-proxy mode
|
||||
*/
|
||||
public AnnotationScopeMetadataResolver(ScopedProxyMode defaultProxyMode) {
|
||||
Assert.notNull(defaultProxyMode, "'defaultProxyMode' must not be null");
|
||||
this.defaultProxyMode = defaultProxyMode;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the type of annotation that is checked for by this
|
||||
* {@link AnnotationScopeMetadataResolver}.
|
||||
* {@code AnnotationScopeMetadataResolver}.
|
||||
* @param scopeAnnotationType the target annotation type
|
||||
*/
|
||||
public void setScopeAnnotationType(Class<? extends Annotation> scopeAnnotationType) {
|
||||
@@ -71,7 +72,6 @@ public class AnnotationScopeMetadataResolver implements ScopeMetadataResolver {
|
||||
this.scopeAnnotationType = scopeAnnotationType;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public ScopeMetadata resolveScopeMetadata(BeanDefinition definition) {
|
||||
ScopeMetadata metadata = new ScopeMetadata();
|
||||
@@ -79,9 +79,9 @@ public class AnnotationScopeMetadataResolver implements ScopeMetadataResolver {
|
||||
AnnotatedBeanDefinition annDef = (AnnotatedBeanDefinition) definition;
|
||||
AnnotationAttributes attributes = AnnotationConfigUtils.attributesFor(annDef.getMetadata(), this.scopeAnnotationType);
|
||||
if (attributes != null) {
|
||||
metadata.setScopeName(attributes.getString("value"));
|
||||
metadata.setScopeName(attributes.getAliasedString("value", this.scopeAnnotationType, definition.getSource()));
|
||||
ScopedProxyMode proxyMode = attributes.getEnum("proxyMode");
|
||||
if (proxyMode == null || proxyMode == ScopedProxyMode.DEFAULT) {
|
||||
if ((proxyMode == null) || (proxyMode == ScopedProxyMode.DEFAULT)) {
|
||||
proxyMode = this.defaultProxyMode;
|
||||
}
|
||||
metadata.setScopedProxyMode(proxyMode);
|
||||
|
||||
@@ -65,6 +65,7 @@ import org.springframework.util.StringUtils;
|
||||
* @author Chris Beams
|
||||
* @author Juergen Hoeller
|
||||
* @author Phillip Webb
|
||||
* @author Sam Brannen
|
||||
* @since 3.0
|
||||
* @see ConfigurationClassParser
|
||||
*/
|
||||
@@ -242,10 +243,12 @@ class ConfigurationClassBeanDefinitionReader {
|
||||
|
||||
// Consider scoping
|
||||
ScopedProxyMode proxyMode = ScopedProxyMode.NO;
|
||||
AnnotationAttributes scope = AnnotationConfigUtils.attributesFor(metadata, Scope.class);
|
||||
if (scope != null) {
|
||||
beanDef.setScope(scope.getString("value"));
|
||||
proxyMode = scope.getEnum("proxyMode");
|
||||
// TODO Determine why type is hard coded to org.springframework.context.annotation.Scope,
|
||||
// since AnnotationScopeMetadataResolver supports a custom scope annotation type.
|
||||
AnnotationAttributes attributes = AnnotationConfigUtils.attributesFor(metadata, Scope.class);
|
||||
if (attributes != null) {
|
||||
beanDef.setScope(attributes.getAliasedString("value", Scope.class, configClass.getResource()));
|
||||
proxyMode = attributes.getEnum("proxyMode");
|
||||
if (proxyMode == ScopedProxyMode.DEFAULT) {
|
||||
proxyMode = ScopedProxyMode.NO;
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
|
||||
import org.springframework.core.annotation.AliasFor;
|
||||
|
||||
/**
|
||||
* When used as a type-level annotation in conjunction with
|
||||
@@ -57,14 +58,25 @@ import org.springframework.beans.factory.config.ConfigurableBeanFactory;
|
||||
public @interface Scope {
|
||||
|
||||
/**
|
||||
* Specifies the scope to use for the annotated component/bean.
|
||||
* <p>Defaults to {@link ConfigurableBeanFactory#SCOPE_SINGLETON SCOPE_SINGLETON}.
|
||||
* @see ConfigurableBeanFactory#SCOPE_SINGLETON
|
||||
* Alias for {@link #name}.
|
||||
* @see #name
|
||||
*/
|
||||
@AliasFor(attribute = "name")
|
||||
String value() default "";
|
||||
|
||||
/**
|
||||
* Specifies the name of the scope to use for the annotated component/bean.
|
||||
* <p>Defaults to an empty string ({@code ""}) which implies
|
||||
* {@link ConfigurableBeanFactory#SCOPE_SINGLETON SCOPE_SINGLETON}.
|
||||
* @since 4.2
|
||||
* @see ConfigurableBeanFactory#SCOPE_PROTOTYPE
|
||||
* @see ConfigurableBeanFactory#SCOPE_SINGLETON
|
||||
* @see org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST
|
||||
* @see org.springframework.web.context.WebApplicationContext#SCOPE_SESSION
|
||||
* @see #value
|
||||
*/
|
||||
String value() default ConfigurableBeanFactory.SCOPE_SINGLETON;
|
||||
@AliasFor(attribute = "value")
|
||||
String name() default "";
|
||||
|
||||
/**
|
||||
* Specifies whether a component should be configured as a scoped proxy
|
||||
|
||||
Reference in New Issue
Block a user