在Struts2中,InternalFactory用于创建将被注入容器的对象
以struts配置中默认的bean为例:
a.向容器中注入bean对象
containerBuilder.factory(ctype, name, new LocatableFactory(name, ctype, cimpl, scope, childNode), scope);
b.从InternalContext中获取Context
public <T> ContainerBuilder factory(final Class<T> type, final String name,
final Factory<? extends T> factory, Scope scope) {
InternalFactory<T> internalFactory =
new InternalFactory<T>() {
public T create(InternalContext context) {
try {
Context externalContext = context.getExternalContext();
return factory.create(externalContext);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public String toString() {
return new LinkedHashMap<String, Object>() {{
put("type", type);
put("name", name);
put("factory", factory);
}}.toString();
}
};
return factory(Key.newInstance(type, name), internalFactory, scope);
}
3.向factories中注册InternalFactory
private <T> ContainerBuilder factory(final Key<T> key,
InternalFactory<? extends T> factory, Scope scope) {
ensureNotCreated();
checkKey(key);
final InternalFactory<? extends T> scopedFactory =
scope.scopeFactory(key.getType(), key.getName(), factory);
factories.put(key, scopedFactory);
if (scope == Scope.SINGLETON) {
singletonFactories.add(new InternalFactory<T>() {
public T create(InternalContext context) {
try {
context.setExternalContext(ExternalContext.newInstance(
null, key, context.getContainerImpl()));
return scopedFactory.create(context);
} finally {
context.setExternalContext(null);
}
}
});
}
return this;
}
4.单列模式
Scope.SINGLETON {
<T> InternalFactory<? extends T> scopeFactory(Class<T> type, String name,
final InternalFactory<? extends T> factory) {
return new InternalFactory<T>() {
T instance;
public T create(InternalContext context) {
synchronized (context.getContainer()) {
if (instance == null) {
instance = factory.create(context);
}
return instance;
}
}
public String toString() {
return factory.toString();
}
};
}
}
当要从容器中获取对象时,只需要给出类名即可
dispatcher.getContainer().getInstance(ValueStackFactory.class)
这样它会首先去调用SINGLETON的create方法,再调用3的InterFactory,最后调用我们最初传进来的Factory;这样做的好处在于它可以进行单例判断,增加内部上下文,把InternalFactory注册到Container等;
在getInstance的过程中,它同样使用了一些内部类ContextualCallable,因在ContainerImpl的很多方法都涉及到InternalContext参数赋值,所以它在callInContext中做了统一处理,而把变化的调用留给ContextualCallable接口去处理
分享到:
相关推荐
这个“Struts2接口文档”是开发者的重要参考资料,提供了关于Struts2框架内各个组件、类库以及接口的详细说明,帮助开发者深入理解框架的内部工作原理并有效地使用其功能。 Struts2的核心组件包括Action、Result、...
在Struts2框架中,`struts2PreResultListener`接口是一个关键组件,主要用于在Action执行结果返回到视图之前进行额外的操作,它在拦截器链执行过程中的特定时刻被调用。 **struts2PreResultListener接口详解:** `...
Struts2 远程代码执行漏洞分析(S2-013) Struts2 是 Apache 官方的产品,最近出了一个远程代码执行漏洞,编号“S2-013”,目前是 0DAY,官方没有修补方案出现。这个漏洞出现在 includeParams 属性中,允许远程命令...
Struts2 是一个基于MVC 模式的Web 应用程序框架,它的源码分析可以帮助我们更好地理解框架的内部机制和工作流程。下面是Struts2 源码分析的相关知识点: 1. Struts2 架构图 Struts2 的架构图主要包括 Filter chain...
Struts2是一款非常流行的Java Web框架,用于构建企业级应用。然而,随着时间的推移,Struts2在安全方面暴露出了一些重要的漏洞,这给使用该框架的系统带来了潜在的安全风险。"Struts2漏洞检查工具Struts2.2019.V2.3...
本篇文章将深入探讨Struts2的运行原理,通过源码分析来揭示其内部工作机制。 首先,我们从核心组件开始。Struts2的核心组件包括Action、FilterDispatcher、Interceptor和Result。Action是业务逻辑的载体,它接收...
总的来说,Struts2的源码分析可以帮助开发者深入理解其内部机制,包括请求处理流程、拦截器的运作方式以及视图组件的实现。这有助于提高应用的可维护性,优化性能,并使开发者能够更好地定制和扩展框架。对于熟悉...
拦截器是一个实现了Struts2提供的`Interceptor`接口的类,它定义了两个方法:`intercept()`和`destroy()`。`intercept()`方法是拦截的核心,它会在Action执行前后被调用,允许开发者进行预处理和后处理操作。 在...
这个过滤器实现了`Filter`接口,是Struts2拦截请求并进行处理的第一步。`init`方法是初始化的入口点,其中涉及多个关键步骤: 1. 初始化`InitOperations`类,这是一个代理类,用于执行各种初始化操作。 2. `...
#### 六、Struts2源码分析 - **深入源码**:针对某些重要知识点,比如Action的执行流程、拦截器的工作原理等,本教程还会带领学员一起探索源码,加深对框架内部机制的理解。 ### 结语 通过以上对Struts2各个方面...
在`AndroidTest`这个文件名中,虽然不明确,但可能包含了一个Android相关的测试部分,或者是一个使用Struts2实现的接口,用于与Android客户端交互。如果涉及到Android,可能需要了解RESTful API设计、JSON数据交换...
在 Struts2 项目开发中,需求分析是非常重要的一步。通过对项目的需求分析,可以确定项目的功能需求、性能需求、安全需求等。例如,在个人信息管理系统中,需要分析用户的需求,例如登录与注册、个人基本信息管理、...
这份"IBM-struts2内部培训资料"包含10个主题,涵盖了Struts2的核心概念和关键特性,对于学习和理解Struts2框架非常有帮助。 首先,让我们逐一探讨这些章节的主要内容: 1. **第一章:struts2认识**:这一章会介绍...
下载Struts2的源代码后,可以通过分析其内部结构来深入了解其工作原理。Struts2的源代码组织得非常清晰,主要包括以下几个部分: 1. **`org.apache.struts2.components`**:这个包包含了Struts2的各种视图组件。...
### Struts1与Struts2的主要区别 #### 概述 Apache Struts 是一个用于构建企业级Java Web应用的开源框架。它分为两个版本:Struts1 和 Struts2。虽然两者都基于模型-视图-控制器(MVC)设计模式,但它们之间存在...
### Struts2的工作机制原理分析及实例整理 #### 一、概述 Struts2作为一款流行的Java Web开发框架,其设计理念和技术实现相比Struts1.x有着显著的不同。尽管两者名称相似,但从架构到实现方式,Struts2都有了质的...
struts2-core-2.0.1.jar, struts2-core-2.0.11.1.jar, struts2-core-2.0.11.2.jar, struts2-core-2.0.11.jar, struts2-core-2.0.12.jar, struts2-core-2.0.14.jar, struts2-core-2.0.5.jar, struts2-core-2.0.6.jar,...
Struts2是一款非常流行的开源Java Web框架,它提供了一种模型-视图-控制器(MVC)架构,帮助开发者构建可维护性和可扩展性良好的Web应用程序。然而,随着时间的推移,Struts2框架出现了一些安全漏洞,这些漏洞可能被...
struts2 chm 程序包 org.apache.struts2 接口概要 接口 说明 StrutsStatics Constants used by Struts. 类概要 类 说明 RequestUtils Request handling utility class. ServletActionContext Web-specific ...