注解@Inject的操作类是ContainerImpl,@Inject在Struts中用到了很多,主要用来构造函数、属性、方法及方法参数注入,当调用ContainerImpl的Inject方法时,这些部分就启动,ContainerImpl初始化时,缓存这些构建方法
这里我们只分析查找这些带@Inject的注入器,并把它们缓存起来。
1.初始化一个注入器Map,用来放置找到@Inject后实例化的注入器,这里使用ReferenceCache缓存类,在运行期构建map,核心方法create会调用addInjectors方法扫描所有注入器加入到ReferenceCache缓存Map里面,并且内部实现ThreadLocal模式规避多线程问题,
/**
* Field and method injectors.
*/
final Map<Class<?>, List<Injector>> injectors =
new ReferenceCache<Class<?>, List<Injector>>() {
@Override
protected List<Injector> create( Class<?> key ) {
List<Injector> injectors = new ArrayList<Injector>();
addInjectors(key, injectors);
return injectors;
}
};
2.addInjectors()方法
void addInjectors( Class clazz, List<Injector> injectors ) {
if (clazz == Obj

本文深入探讨了Struts2中注解@Inject的使用,特别是在构造函数、属性、方法及参数注入的角色。重点分析了ContainerImpl类如何在初始化时查找并缓存这些注入器,利用ReferenceCache进行内存管理,并通过ThreadLocal解决多线程问题。
最低0.47元/天 解锁文章
1665

被折叠的 条评论
为什么被折叠?



