创建注入框架(4)

我们尚未解决的问题有两个,第一是scope,第二是Qualifier,先解决scope。 关于scope,我的思路是给原有的provider加一层wrapper,采用包装器模式(或者叫装饰模式),因为没涉及到web,所以这里只考虑Singleton。 先写一个singleton的provider,如下:

public class SingletonProvider<T> implements Provider<T> {

    private Provider<T> originProvider;
    private boolean get = false;
    private T result = null;

    public SingletonProvider(Provider<T> originProvider) {
        this.originProvider = originProvider;
    }

    @Override
    public T get() {
        if (!get && result == null) {
            get = true;
            result = originProvider.get();
        }
        return result;
    }
}

注意,这个类很简陋,没考虑线程安全等问题。 _binder这个类做些小修改, 修改后的_binder:

public class _binder<T> {

    private Binder<T> binder;
    private String name = Binder.DEFAULT_BIND_NAME;

    private boolean singleton;

    _binder(Binder<T> binder) {
        this.binder = binder;
    }

    private void setName(String name) {
        this.name = name;
    }

    public _binder<T> named(String name) {
        setName(name);
        return this;
    }

    public _binder<T> singleton(boolean singleton) {
        this.singleton = singleton;
        return this;
    }

    public _binder<T> providedBy(Provider<T> provider) {
        if (singleton) {
            provider = new SingletonProvider<>(provider);
        }
        binder.bind(name,provider);
        return this;
    }

    public <K extends T> _binder<T> instanceOf(Class<K> impl) {
        if (impl.isAnnotationPresent(Named.class)) {
            Named named = impl.getAnnotation(Named.class);
            this.named(named.value());
        }
        if (impl.isAnnotationPresent(Singleton.class)) {
            this.singleton(true);
        }
        return providedBy(new ParseClass<>(binder.gettClass(),impl,Container.this));
    }

}

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

转载于:https://my.oschina.net/mylgb634335272/blog/777582

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值