注解@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注解了
分享到:
相关推荐
@Inject 是 JSR330 规范实现的依赖注入注解,基于类型来查找 bean 注入的。如果需要指定名称 beanName,则可以结合使用 @Named 注解。@Inject 的注入方式与 @Autowired 类似,但 @Inject 是 JSR330 规范的一部分,而...
这两个服务器都支持Java EE规范,其中包含了JSR 330(Java Contexts and Dependency Injection for the Java EE platform),这个规范定义了`@Inject`注解,使得注入日志器变得简单。 `@Inject`是JSR 330的一部分,...
python注入 依赖注入是python的好方法。 不是Guice或Spring的港口。 主要特征 快速地。 线程安全的。 易于使用。 不窃取类的构造函数。 不要尝试管理您的应用程序对象图。 透明地集成到测试中。 支持Python ...
【kotlin-inject:探索Kotlin的依赖注入库】 在软件开发中,依赖注入(Dependency Injection,简称DI)是一种设计模式,它可以帮助我们构建松耦合、可测试且易于维护的代码。Kotlin-inject是Kotlin社区为Kotlin语言...
在Nutz中,我们通常使用`@Inject`注解来标记需要容器自动注入的字段或方法。这个注解告诉Nutz容器,这个字段或方法的依赖应该由容器提供。 ```java public class MyService { @Inject private MyRepository ...
S2-016 漏洞是由于 Struts2 的 Ognl 表达式语言解析器存在缺陷,从而导致攻击者可以 inject 恶意代码。这个漏洞影响了 Struts2 的所有版本。 S2-017 漏洞是由于 Struts2 的 DefaultActionMapper 的 ...
injectdll远程线程注入
这个"REMOTE--INJECT.rar_c++注入源码_inject_remote"压缩包包含了一个C++实现的远程注入示例,对于理解这一技术及其应用非常有帮助。 首先,让我们详细解释一下远程注入的概念。远程注入主要是通过向目标进程注入...
接着,你可以定义一个Struts2 Action,并使用`@Inject`注解来注入你需要的服务。例如: ```java public class MyAction extends ActionSupport { private MyService myService; @Inject public void ...
然而,正如标题“鬼哥struts2测试工具.rar_392_inject_struts2测试工具_鬼哥struts2”所示,这个压缩包涉及到的是针对Struts2框架的一个安全问题:Struts2漏洞利用工具。 描述中的"392 inject"可能指的是CVE-2017-...
在`Struts2Demo`项目中,你还可以学习到如何配置Struts2的`struts-plugin.xml`和`struts.xml`文件,以便启用注解支持,并了解如何在web.xml中配置过滤器,确保Struts2框架能正确拦截请求。 总结,Struts2注解是...
Struts2是一个强大的Java web应用程序框架,它极大地简化了MVC(模型-视图-控制器)架构的实现。在这个小实例中,我们将深入探讨如何利用Struts2的注解来构建一个简洁而高效的Web应用。 首先,让我们了解什么是注解...
【易语言X64注入器】是一个使用易语言编写的64位程序注入工具,它主要用于在64位操作系统环境下实现对其他进程的代码注入功能。在编程领域,程序注入是一种高级技术,常用于调试、监控、篡改或扩展目标程序的行为。...
1. @Inject:这个注解是最基础的,用于声明一个构造器、字段或方法需要被注入。例如,当一个类的某个字段标记了@Inject,容器会在实例化该类时自动为其填充值。 ```java public class MyClass { @Inject private ...
在这个主题中,我们将深入探讨C#实现DLL注入的过程,以及如何编写C#注入器源码。 首先,DLL注入的核心在于创建一个线程,该线程在目标进程中执行,从而能够调用注入的DLL中的函数。在C#中,我们可以使用以下关键...
Struts2是一个非常流行的Java Web开发框架,它简化了MVC(模型-视图-控制器)架构的应用程序开发。在“struts2零配置入门代码”这个主题中,我们将深入探讨如何在不编写大量XML配置文件的情况下,启动并运行一个基本...
在Struts2框架中,获取`HttpServletRequest`对象是开发者经常需要进行的操作,因为这个对象包含了HTTP请求的所有相关信息。...理解并熟练运用这些方法,可以提高你在Struts2开发中的效率和代码质量。
例如,如果你有一个Activity需要使用某个Service,你可以在Activity中定义一个Service类型的成员变量,并加上`@Inject`注解,Roboguice会在初始化Activity时自动将Service实例注入。 在这个项目中,`RoboguiceTest`...
在"安卓Andriod源码——用Roboguice实现依赖注入-.zip"这个压缩包中,包含的`RoboguiceTest`可能是一个示例项目,用于演示如何在实际的Android应用中集成和使用Roboguice。通过查看和学习这个示例,你将能更深入地...
这里,`userService`属性被设置为`spring:UserService`,Struts2会查找Spring应用上下文中的`UserService` bean并注入到`LoginAction`中。 3. **ActionContext与Value Stack**: Struts2的ActionContext保存了...