Поведение аннотации @RequestScope с наследованием Java - PullRequest
0 голосов
/ 21 марта 2020

Допустим, у нас есть класс

@RequestScope 
public abstract class A {
    int a;
}

и другой класс, который расширяет указанный выше класс

@Service 
public class B extends A {
    public int getA () { return a; }    
}

Является ли переменная этого класса B (которая расширяется от A) переменная области запроса?

UPD

Я просматривал код пружины, он говорит:

/** * Constant for the default scope name: {@code ""}, equivalent to singleton * status unless overridden from a parent bean definition (if applicable). */ public static final String SCOPE_DEFAULT = "";

Кроме того,

((AbstractBeanDefinition)((AnnotationConfigEmbeddedWebApplicationContext) ctx).
getBeanDefinition("b")).scope

возвращает "singleton"

, но если я отмечу класс B с @RequestScope, это свойство изменится на ""
, которое, как я предполагаю, sigleton снова

1 Ответ

0 голосов
/ 21 марта 2020

Чтобы наследуемая аннотация была помечена @Inherited аннотацией. Взгляните на исходный код @RequestScope:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Scope(WebApplicationContext.SCOPE_REQUEST)
public @interface RequestScope {

    /**
     * Alias for {@link Scope#proxyMode}.
     * <p>Defaults to {@link ScopedProxyMode#TARGET_CLASS}.
     */
    @AliasFor(annotation = Scope.class)
    ScopedProxyMode proxyMode() default ScopedProxyMode.TARGET_CLASS;

}

Он не помечен @Inherited. Поэтому это не влияет на подклассы. Это означает, что переменная класса B из вашего примера является не областью запроса, а синглтоном, как это должно быть по умолчанию. Вы можете найти более подробную информацию о предопределенных аннотациях здесь .

...