文档章节

创建注入框架(5)

legen_wait_dary
 legen_wait_dary
发布于 2016/10/28 19:23
字数 563
阅读 3
收藏 1

这一节提供对Qualifier的实现。 这个我思考过比较久,因为这种实现起来要简单方便就不是很容易,这里我提供一种很简陋的办法。 首先创建一个接口,名为ID:

ID.java

public interface ID<Qualifier extends Annotation> {

String name(Qualifier qualifier);

}

然后在Container里面添加一个映射,以及注册方法和提取方法,如下:

Container.java部分代码

private Map<Class<? extends Annotation>,ID> qualifiers;


public Container() {
    mapper = new HashMap<>();
    qualifiers = new HashMap<>();
    registerQualifier(Named.class,new NamedId());
}

@SuppressWarnings("unchecked")
public <T> _binder<T> registerClass(Class<T> inter) {
    Binder<T> binder;
    if (mapper.containsKey(inter)) {
        binder= (Binder<T>) mapper.get(inter);
    }else {
        binder = new Binder<>(inter);
        mapper.put(inter,binder);
    }
    return new _binder<>(binder);
}

public <T extends Annotation> void registerQualifier(Class<T> annotationClass,
                                                     ID<T> id) {
    qualifiers.put(annotationClass,id);
}

@SuppressWarnings("unchecked")
<T extends Annotation> ID<T> findQualifier(Class<T> annotationClass) {
    return qualifiers.get(annotationClass);
}

<T extends Annotation> String getName(Class<T> annotationClass,T annotation) {
    if (qualifiers.containsKey(annotationClass))
        return findQualifier(annotationClass).name(annotation);
    return Binder.DEFAULT_BIND_NAME;
}

最后给_binder添加一个withAnnotate方法,如下

@SuppressWarnings("unchecked")
    public _binder<T> withAnnotate(Annotation annotate) {
        Class annotationType = annotate.annotationType();
        if (annotationType.isAnnotationPresent(Qualifier.class)) {
            setName(Container.this.getName(annotationType,annotate));
        }
        return this;
    }

当然instanceOf方法就需要改变一下:

public <K extends T> _binder<T> instanceOf(Class<K> impl) {
        for (Annotation annotation:impl.getAnnotations()) {
            withAnnotate(annotation);
        }
        if (impl.isAnnotationPresent(Singleton.class)) {
            this.singleton(true);
        }
        return providedBy(new ParseClass<>(binder.gettClass(),impl,Container.this));
}

然后ParseClass的GetValue方法:

@SuppressWarnings("unchecked")
private Object getValue(AnnotatedElement accessibleObject,Class tClass) {
    for (Annotation annotation:accessibleObject.getAnnotations()){
        Class annotationType = annotation.annotationType();
        if (annotationType.isAnnotationPresent(Qualifier.class)) {
            String name = container.getName(annotationType,annotation);
            return container.getImplByName(tClass,name);
        }
    }
    return container.getImpl(tClass);
}

我提供了一个NamedId

NamedId.java:

public class NamedId implements ID<Named> {
    @Override
    public String name(Named named) {
        return "NAMED_"+named.value();
    }
}

对_binder的named的方法修改下:

public _binder<T> named(final String name) {
        withAnnotate(new Named(){

            @Override
            public Class<? extends Annotation> annotationType() {
                return Named.class;
            }

            @Override
            public String value() {
                return name;
            }
        });
        return this;
}

测试能够使用,不过对于自定义的Qualifier,需要先在container注册。

注解框架的创建就到这,后期我可能再进行完善,但估计是不会去完善,我是个懒人,除非很有必要,我估计不会去做了。如果大家对spring用的烦了,推荐一个注解框架,谷歌的guice,它做的真的很不错,我也是看到了它才想着写这个伪教程。这个项目我提交到了github上,大家有兴趣可以下载下来,不过基本代码文章都写了 项目地址:https://github.com/liuguobing634/zhuru

这些文章也同步到了我自己的公众号平台:互联网科技杂谈

© 著作权归作者所有

legen_wait_dary
粉丝 0
博文 10
码字总数 6658
作品 0
荆州
私信 提问
搭建你的Spring.Net+Nhibernate+Asp.Net Mvc 框架 (六)写在后面的话

如果在你的项目中,配置的没有报错,但是总是注入进来的都是null的话,可查看配置文件所在的项目是否添加了配置文件中所引用或配置了的项目。还有就是mvc中control中注入都失败了。这个最后还...

aicoder
2010/09/07
0
0
Spring面试问答Top 25

本人收集了一些在大家在面试时被经常问及的关于Spring的主要问题,这些问题有可能在你下次面试时就会被问到。对于本文中未提及的Spring其他模块,我会单独分享面试的问题和答案。 欢迎大家向...

赵小宾
2015/05/04
270
1
控制反转与依赖注入通俗描述

控制反转(IOC): 由框架或其他某些东西来控制需要调用的事件处理器或其他东西,而不是由业务逻辑决定。 举例:spring中的bean,我们在spring项目中配置了datasource后,不需要关注如何调用它...

李矮矮
2016/09/26
36
0
Spring面试基本问题(1)

1、什么是Spring框架?Spring框架有哪些主要模块? Spring框架是一个为Java应用程序的开发提供了综合、广泛的基础性支持的Java平台。Spring帮助开发者解决了开发中基础性的问题,使得开发人员...

yaohong
2016/11/08
0
0
Spring面试,IoC和AOP的理解

spring 的优点? 1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易...

Sandy_wu
2013/06/08
2.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

JMM内存模型(一)&volatile关键字的可见性

在说这个之前,我想先说一下计算机的内存模型: CPU在执行的时候,肯定要有数据,而数据在内存中放着呢,这里的内存就是计算机的物理内存,刚开始还好,但是随着技术的发展,CPU处理的速度越...

走向人生巅峰的大路
14分钟前
29
0
你对AJAX认知有多少(2)?

接着昨日内容,我们几天继续探讨ajax的相关知识点 提到ajax下面几个问题又是必须要了解的啦~~~ 8、在浏览器端如何得到服务器端响应的XML数据。 通过XMLHttpRequest对象的responseXMl属性 9、 ...

理性思考
24分钟前
4
0
正则表达式基础(一)

1.转义 转义的作用: 当某个字符在表达式中具有特殊含义,例如字符串引号中出现了引号,为了可以使用这些字符本身,而不是使用其在表达式中的特殊含义,则需要通过转义符“\”来构建该字符转...

清自以敬
26分钟前
4
0
idea中@Data标签getset不起作用

背景:换电脑以后在idea中有@data注解都不生效 解决办法:idea装个插件 https://blog.csdn.net/seapeak007/article/details/72911529...

栾小糖
32分钟前
4
0
Apache Kudu 不能删除不存在的数据

使用Apache Kudu客户端,对KafkaConnect Sink 进行扩展。 使用的Apache Kudu 的Java 客户端。突然有天发现作业无法提交,一直报错。 后来才发现这是Kudu自身的一种校验机制。为了忽略这种校验...

吐槽的达达仔
42分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部