我爱编程

spring笔记-AnnotationScopeMetadata

2018-06-11  本文已影响61人  兴浩

AnnotationScopeMetadataResolver主要负责对Scope注解的解析

ScopeMetadata就是对Scope注解的描述转换,
以Metadata结尾命名的表示对元数据(注解)的描述

ScopeMetadata对象描述

public class ScopeMetadata {

    private String scopeName = BeanDefinition.SCOPE_SINGLETON;

    private ScopedProxyMode scopedProxyMode = ScopedProxyMode.NO;

    public void setScopeName(String scopeName) {
        Assert.notNull(scopeName, "'scopeName' must not be null");
        this.scopeName = scopeName;
    }

    public String getScopeName() {
        return this.scopeName;
    }

    public void setScopedProxyMode(ScopedProxyMode scopedProxyMode) {
        Assert.notNull(scopedProxyMode, "'scopedProxyMode' must not be null");
        this.scopedProxyMode = scopedProxyMode;
    }

    public ScopedProxyMode getScopedProxyMode() {
        return this.scopedProxyMode;
    }

}

示例代码

public class AnnotationScopeMetadataResolverTests {

    private AnnotationScopeMetadataResolver scopeMetadataResolver = new AnnotationScopeMetadataResolver();


    @Test
    public void resolveScopeMetadataShouldNotApplyScopedProxyModeToSingleton() {
        AnnotatedBeanDefinition bd = new AnnotatedGenericBeanDefinition(AnnotatedWithSingletonScope.class);
        ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(bd);
        assertNotNull("resolveScopeMetadata(..) must *never* return null.", scopeMetadata);
        assertEquals(BeanDefinition.SCOPE_SINGLETON, scopeMetadata.getScopeName());
        assertEquals(NO, scopeMetadata.getScopedProxyMode());
    }

    @Test
    public void resolveScopeMetadataShouldApplyScopedProxyModeToPrototype() {
        this.scopeMetadataResolver = new AnnotationScopeMetadataResolver(INTERFACES);
        AnnotatedBeanDefinition bd = new AnnotatedGenericBeanDefinition(AnnotatedWithPrototypeScope.class);
        ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(bd);
        assertNotNull("resolveScopeMetadata(..) must *never* return null.", scopeMetadata);
        assertEquals(BeanDefinition.SCOPE_PROTOTYPE, scopeMetadata.getScopeName());
        assertEquals(INTERFACES, scopeMetadata.getScopedProxyMode());
    }

    @Test
    public void resolveScopeMetadataShouldReadScopedProxyModeFromAnnotation() {
        AnnotatedBeanDefinition bd = new AnnotatedGenericBeanDefinition(AnnotatedWithScopedProxy.class);
        ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(bd);
        assertNotNull("resolveScopeMetadata(..) must *never* return null.", scopeMetadata);
        assertEquals("request", scopeMetadata.getScopeName());
        assertEquals(TARGET_CLASS, scopeMetadata.getScopedProxyMode());
    }

    @Test
    public void customRequestScope() {
        AnnotatedBeanDefinition bd = new AnnotatedGenericBeanDefinition(AnnotatedWithCustomRequestScope.class);
        ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(bd);
        assertNotNull("resolveScopeMetadata(..) must *never* return null.", scopeMetadata);
        assertEquals("request", scopeMetadata.getScopeName());
        assertEquals(NO, scopeMetadata.getScopedProxyMode());
    }

    @Test
    public void customRequestScopeViaAsm() throws IOException {
        MetadataReaderFactory readerFactory = new SimpleMetadataReaderFactory();
        MetadataReader reader = readerFactory.getMetadataReader(AnnotatedWithCustomRequestScope.class.getName());
        AnnotatedBeanDefinition bd = new AnnotatedGenericBeanDefinition(reader.getAnnotationMetadata());
        ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(bd);
        assertNotNull("resolveScopeMetadata(..) must *never* return null.", scopeMetadata);
        assertEquals("request", scopeMetadata.getScopeName());
        assertEquals(NO, scopeMetadata.getScopedProxyMode());
    }

    @Test
    public void customRequestScopeWithAttribute() {
        AnnotatedBeanDefinition bd = new AnnotatedGenericBeanDefinition(
            AnnotatedWithCustomRequestScopeWithAttributeOverride.class);
        ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(bd);
        assertNotNull("resolveScopeMetadata(..) must *never* return null.", scopeMetadata);
        assertEquals("request", scopeMetadata.getScopeName());
        assertEquals(TARGET_CLASS, scopeMetadata.getScopedProxyMode());
    }

    @Test
    public void customRequestScopeWithAttributeViaAsm() throws IOException {
        MetadataReaderFactory readerFactory = new SimpleMetadataReaderFactory();
        MetadataReader reader = readerFactory.getMetadataReader(AnnotatedWithCustomRequestScopeWithAttributeOverride.class.getName());
        AnnotatedBeanDefinition bd = new AnnotatedGenericBeanDefinition(reader.getAnnotationMetadata());
        ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(bd);
        assertNotNull("resolveScopeMetadata(..) must *never* return null.", scopeMetadata);
        assertEquals("request", scopeMetadata.getScopeName());
        assertEquals(TARGET_CLASS, scopeMetadata.getScopedProxyMode());
    }

    @Test(expected = IllegalArgumentException.class)
    public void ctorWithNullScopedProxyMode() {
        new AnnotationScopeMetadataResolver(null);
    }

    @Test(expected = IllegalArgumentException.class)
    public void setScopeAnnotationTypeWithNullType() {
        scopeMetadataResolver.setScopeAnnotationType(null);
    }


    @Retention(RetentionPolicy.RUNTIME)
    @Scope("request")
    @interface CustomRequestScope {
    }

    @Retention(RetentionPolicy.RUNTIME)
    @Scope("request")
    @interface CustomRequestScopeWithAttributeOverride {

        ScopedProxyMode proxyMode();
    }

    @Scope("singleton")
    private static class AnnotatedWithSingletonScope {
    }

    @Scope("prototype")
    private static class AnnotatedWithPrototypeScope {
    }

    @Scope(scopeName = "request", proxyMode = TARGET_CLASS)
    private static class AnnotatedWithScopedProxy {
    }

    @CustomRequestScope
    private static class AnnotatedWithCustomRequestScope {
    }

    @CustomRequestScopeWithAttributeOverride(proxyMode = TARGET_CLASS)
    private static class AnnotatedWithCustomRequestScopeWithAttributeOverride {
    }

}
上一篇 下一篇

猜你喜欢

热点阅读