`
txidol
  • 浏览: 54788 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

【Struts2源码】@Inject查找并缓存注入器

 
阅读更多

注解@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注解了



分享到:
评论

相关推荐

    详解Spring依赖注入:@Autowired,@Resource和@Inject区别与实现原理

    @Inject 是 JSR330 规范实现的依赖注入注解,基于类型来查找 bean 注入的。如果需要指定名称 beanName,则可以结合使用 @Named 注解。@Inject 的注入方式与 @Autowired 类似,但 @Inject 是 JSR330 规范的一部分,而...

    injectLogger:这是 glassfish 或 jboss 注入记录器。 @Inject 记录器记录器;

    这两个服务器都支持Java EE规范,其中包含了JSR 330(Java Contexts and Dependency Injection for the Java EE platform),这个规范定义了`@Inject`注解,使得注入日志器变得简单。 `@Inject`是JSR 330的一部分,...

    python-inject:Python依赖注入

    python注入 依赖注入是python的好方法。 不是Guice或Spring的港口。 主要特征 快速地。 线程安全的。 易于使用。 不窃取类的构造函数。 不要尝试管理您的应用程序对象图。 透明地集成到测试中。 支持Python ...

    kotlin-inject:kotlin的依赖注入库

    【kotlin-inject:探索Kotlin的依赖注入库】 在软件开发中,依赖注入(Dependency Injection,简称DI)是一种设计模式,它可以帮助我们构建松耦合、可测试且易于维护的代码。Kotlin-inject是Kotlin社区为Kotlin语言...

    在Nutz中使用Ioc-Annotation的入门教程

    在Nutz中,我们通常使用`@Inject`注解来标记需要容器自动注入的字段或方法。这个注解告诉Nutz容器,这个字段或方法的依赖应该由容器提供。 ```java public class MyService { @Inject private MyRepository ...

    struts2 最新漏洞 S2-016、S2-017修补方案 .docx

    S2-016 漏洞是由于 Struts2 的 Ognl 表达式语言解析器存在缺陷,从而导致攻击者可以 inject 恶意代码。这个漏洞影响了 Struts2 的所有版本。 S2-017 漏洞是由于 Struts2 的 DefaultActionMapper 的 ...

    injectdll远程线程注入

    injectdll远程线程注入

    REMOTE--INJECT.rar_c++注入源码_inject_remote

    这个"REMOTE--INJECT.rar_c++注入源码_inject_remote"压缩包包含了一个C++实现的远程注入示例,对于理解这一技术及其应用非常有帮助。 首先,让我们详细解释一下远程注入的概念。远程注入主要是通过向目标进程注入...

    struts2 整合guice

    接着,你可以定义一个Struts2 Action,并使用`@Inject`注解来注入你需要的服务。例如: ```java public class MyAction extends ActionSupport { private MyService myService; @Inject public void ...

    鬼哥struts2测试工具.rar_392_inject_struts2测试工具_鬼哥struts2

    然而,正如标题“鬼哥struts2测试工具.rar_392_inject_struts2测试工具_鬼哥struts2”所示,这个压缩包涉及到的是针对Struts2框架的一个安全问题:Struts2漏洞利用工具。 描述中的"392 inject"可能指的是CVE-2017-...

    Struts2 注解 Demo

    在`Struts2Demo`项目中,你还可以学习到如何配置Struts2的`struts-plugin.xml`和`struts.xml`文件,以便启用注解支持,并了解如何在web.xml中配置过滤器,确保Struts2框架能正确拦截请求。 总结,Struts2注解是...

    struts2注解小实例

    Struts2是一个强大的Java web应用程序框架,它极大地简化了MVC(模型-视图-控制器)架构的实现。在这个小实例中,我们将深入探讨如何利用Struts2的注解来构建一个简洁而高效的Web应用。 首先,让我们了解什么是注解...

    易语言X64注入器.rar

    【易语言X64注入器】是一个使用易语言编写的64位程序注入工具,它主要用于在64位操作系统环境下实现对其他进程的代码注入功能。在编程领域,程序注入是一种高级技术,常用于调试、监控、篡改或扩展目标程序的行为。...

    x86,x64 汇编代码注入器 C,C++写的

    2. **获取进程内存权限**:为了能够在目标进程中写入代码,注入器必须获取足够的访问权限。这通常通过Windows API函数如`OpenProcess`来完成。 3. **分配内存**:在目标进程中分配一块内存供注入代码使用。`...

    javax-inject-1.0-201002241208.jar.zip

    1. @Inject:这个注解是最基础的,用于声明一个构造器、字段或方法需要被注入。例如,当一个类的某个字段标记了@Inject,容器会在实例化该类时自动为其填充值。 ```java public class MyClass { @Inject private ...

    C#DLL注入源码-C#注入器源码

    在这个主题中,我们将深入探讨C#实现DLL注入的过程,以及如何编写C#注入器源码。 首先,DLL注入的核心在于创建一个线程,该线程在目标进程中执行,从而能够调用注入的DLL中的函数。在C#中,我们可以使用以下关键...

    struts2零配置入门代码

    Struts2是一个非常流行的Java Web开发框架,它简化了MVC(模型-视图-控制器)架构的应用程序开发。在“struts2零配置入门代码”这个主题中,我们将深入探讨如何在不编写大量XML配置文件的情况下,启动并运行一个基本...

    struts2中获得request对象

    在Struts2框架中,获取`HttpServletRequest`对象是开发者经常需要进行的操作,因为这个对象包含了HTTP请求的所有相关信息。...理解并熟练运用这些方法,可以提高你在Struts2开发中的效率和代码质量。

    Android高级应用源码-用Roboguice实现依赖注入-.zip

    例如,如果你有一个Activity需要使用某个Service,你可以在Activity中定义一个Service类型的成员变量,并加上`@Inject`注解,Roboguice会在初始化Activity时自动将Service实例注入。 在这个项目中,`RoboguiceTest`...

    安卓Andriod源码——用Roboguice实现依赖注入-.zip

    在"安卓Andriod源码——用Roboguice实现依赖注入-.zip"这个压缩包中,包含的`RoboguiceTest`可能是一个示例项目,用于演示如何在实际的Android应用中集成和使用Roboguice。通过查看和学习这个示例,你将能更深入地...

Global site tag (gtag.js) - Google Analytics