首先需要知道实例是如何创建以及如何被注入的,而这一切都由container这个容器进行管理。

@H_403_6@1.实例构建

class ContainerImpl implements Container {

final Map,InternalFactory>> factories;

final Map,Set> factoryNamesByType;

ContainerImpl( Map,InternalFactory>> factories ) {

this.factories = factories;

Map,Set> map = new HashMap,Set>();

for ( Key> key : factories.keySet() ) {

Set names = map.get(key.getType());

if (names == null) {

names = new HashSet();

map.put(key.getType(),names);

}

names.add(key.getName());

}

for ( Entry,Set> entry : map.entrySet() ) {

entry.setValue(Collections.unmodifiableSet(entry.getValue()));

}

this.factoryNamesByType = Collections.unmodifiableMap(map);

}

...

}

构造时,传入factories和factoryNamesByType。前者是根据key(由class和name组成)查找类的实例构造方法(授人以鱼不如授人以渔),以此来构造实例,然后进行依赖注入。后者是根据class查找所有的实现类名。

2.injector注入器

class ContainerImpl implements Container {

final Map,List> injectors =

new ReferenceCache,List>() {

@Override

protected List create( Class> key ) {

List injectors = new ArrayList();

addInjectors(key,injectors);

return injectors;

}

};

...

}

注入器包括属性注入器和方法注入器等。(每个@injector注解都会被解析为一个注入器类,FieldInjector、MethodInjector)。ReferenceCache继承Map并对其做了扩展,当get(key)时,如果不存在,则会调用create方法创建相应的injectors。injector内部有个inject方法,会调用method.invoke从而调用加了@inject注解的方法(针对方法@inject,属性@inject类似)

相关文章

总结

以上是编程之家为你收集整理的@inject依赖注入的过程全部内容,希望文章能够帮你解决@inject依赖注入的过程所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐