DefaultConfiguration.java中的一句讲containerProvider注入到bootstrap的调用:
bootstrap.inject(containerProvider);//调用下面的ContainerImpl中的inject方法。
ContainerImpl.java
public void inject(final Object o){
callInContext(new ContextualCallable<Void>(){
public Void call(InternalContext context){
inject(o, context);
return null;
}
});
}
void inject(Object o, InternalContext context){
List<Injector> injectors = this.injectors.get(o.getClass());
for(Injector injector : injectors){
injector.inject(context, o);//完成对属性或者方法的注入
}
}
<T> T callInContext(ContextualCallable<T> callable){
Object[] reference = localContext.get();
if(reference[0] == null){
reference[0] = new InternalContext(this);
try{
return callable.call((callInContext)reference[0]);//调用call方法并返回callInContext对象
}finally{
reference[0] = null;
localContext.remove();
}
}else{
return callable.call((callInContext)reference[0]);
}
}