注解@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 == Object.class) {
return;
}
// Add injectors for superclass first.
addInjectors(clazz.getSuperclass(), injectors);
// TODO (crazybob): Filter out overridden members.
addInjectorsForFields(clazz.getDeclaredFields(), false, injectors);
addInjectorsForMethods(clazz.getDeclaredMethods(), false, injectors);
}
void addInjectorsForMethods( Method[] methods, boolean statics,
List<Injector> injectors ) {
addInjectorsForMembers(Arrays.asList(methods), statics, injectors,
new InjectorFactory<Method>() {
public Injector create( ContainerImpl container, Method method,
String name ) throws MissingDependencyException {
return new MethodInjector(container, method, name);
}
});
}
void addInjectorsForFields( Field[] fields, boolean statics,
List<Injector> injectors ) {
addInjectorsForMembers(Arrays.asList(fields), statics, injectors,
new InjectorFactory<Field>() {
public Injector create( ContainerImpl container, Field field,
String name ) throws MissingDependencyException {
return new FieldInjector(container, field, name);
}
});
}
3.
找到有注解@Inject的成员,调用传入的injectorFactory.create方法创建真正的Injector实例 加入到注入器集合中
<M extends Member & AnnotatedElement> void addInjectorsForMembers(
List<M> members, boolean statics, List<Injector> injectors,
InjectorFactory<M> injectorFactory ) {
for ( M member : members ) {
if (isStatic(member) == statics) {
Inject inject = member.getAnnotation(Inject.class);
if (inject != null) {
try {
injectors.add(injectorFactory.create(this, member, inject.value()));
} catch ( MissingDependencyException e ) {
if (inject.required()) {
throw new DependencyException(e);
}
}
}
}
}
}
这样就可以无差别的在构造函数、属性、方法及方法参数处使用@Inject注解了
分享到:
相关推荐
注入记录器这是 glassfish 或 jboss 注入记录器。 @Inject 记录器记录器;
主要介绍了详解Spring依赖注入:@Autowired,@Resource和@Inject区别与实现原理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
injectdll远程线程注入
python注入 依赖注入是python的好方法。 不是Guice或Spring的港口。 主要特征 快速地。 线程安全的。 易于使用。 不窃取类的构造函数。 不要尝试管理您的应用程序对象图。 透明地集成到测试中。 支持Python ...
安卓Android源码——Inject增加sqlite3数据库映射注解(ORM).zip
远程注入源码,,很经典,需要的可以看看。含泪分享.
易语言注入64位程序 转载的 勿喷
角度.hx angular.js 的 Haxe 绑定实施的控制器通过实现angularhx.... @inject是强制性的,按名称列出将注入控制器的服务。 注入对于 JavaScript 缩小是安全的。 服务将以与@inject元数据相同的顺序注入。 注意:确
Redux中间件生成器,允许将依赖项注入到动作创建者中。安装npm install redux-inject用法示例(ES6 / ES7) import { applyMiddleware , createStore } from 'redux' ;import inject from 'redux-inject' ;import ...
lopyEVE Python 注入器 源码 ============================ 将Python代码块编译后注入目标进程内 ============================ 本源码参考 lolpy4 增加wxwidget Gui ============================ 编译平台:Win7 ...
NULL 博文链接:https://gevin.iteye.com/blog/1131500
Dll注入 InjectDLL 一个把DLL注入到其它进程的程序
安卓Andriod源码——Inject增加sqlite3数据库映射注解(ORM).zip
lopyEVE Python 注入器 可执行档 ============================ 将Python代码块编译后注入目标进程内, 可执行档以网络游戏EVE为目标进程, 另有源码放出,请自行搜索 ============================ !本源码仅供...
there is a injection tools for web platform structs two , maybe you can use it to exploit a website
注入装饰器简单的依赖注入器。开始吧npm install --save-dev inject-decorators用法let num = 1;let str = "abc";let bool = true;let symbol = Symbol();@Inject(num, str, bool, symbol)class Foo { constructor...
dll注入示例,c++编写,仅供学习参考
exe将dll注入到explorer.exe资源管理器进程_DLL注入示例.zip
角度注入用于角度相关性注入的角度装饰器。安装 $ npm install --save angular-inject用法 // ES2016 styleimport {inject} from 'angular-inject'// CommonJS stylelet inject = require('angular-inject').inject;...
官网上说provide 和 inject 绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的属性还是可响应的。 provide: Object | () => Object(一个对象或返回一个对象的函数) inject...