我们尚未解决的问题有两个,第一是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));
}
}
这些文章也同步到了我自己的公众号平台:互联网科技杂谈