美文网首页我爱编程
spring笔记-AnnotationScopeMetadata

spring笔记-AnnotationScopeMetadata

作者: 兴浩 | 来源:发表于2018-06-11 19:35 被阅读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 {
        }
    
    }
    

    相关文章

      网友评论

        本文标题:spring笔记-AnnotationScopeMetadata

        本文链接:https://www.haomeiwen.com/subject/hgaheftx.html