`
liebaorun
  • 浏览: 22809 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

Struts2 内部接口InternalFactory、ContextualCallable分析

阅读更多
在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框架内各个组件、类库以及接口的详细说明,帮助开发者深入理解框架的内部工作原理并有效地使用其功能。 Struts2的核心组件包括Action、Result、...

    struts2PreResultListener接口

    在Struts2框架中,`struts2PreResultListener`接口是一个关键组件,主要用于在Action执行结果返回到视图之前进行额外的操作,它在拦截器链执行过程中的特定时刻被调用。 **struts2PreResultListener接口详解:** `...

    Struts2远程代码执行漏洞分析(S2-013)1

    Struts2 远程代码执行漏洞分析(S2-013) Struts2 是 Apache 官方的产品,最近出了一个远程代码执行漏洞,编号“S2-013”,目前是 0DAY,官方没有修补方案出现。这个漏洞出现在 includeParams 属性中,允许远程命令...

    struts2 源码分析

    Struts2 是一个基于MVC 模式的Web 应用程序框架,它的源码分析可以帮助我们更好地理解框架的内部机制和工作流程。下面是Struts2 源码分析的相关知识点: 1. Struts2 架构图 Struts2 的架构图主要包括 Filter chain...

    Struts2漏洞检查工具Struts2.2019.V2.3

    Struts2是一款非常流行的Java Web框架,用于构建企业级应用。然而,随着时间的推移,Struts2在安全方面暴露出了一些重要的漏洞,这给使用该框架的系统带来了潜在的安全风险。"Struts2漏洞检查工具Struts2.2019.V2.3...

    struts2部分源码分析

    本篇文章将深入探讨Struts2的运行原理,通过源码分析来揭示其内部工作机制。 首先,我们从核心组件开始。Struts2的核心组件包括Action、FilterDispatcher、Interceptor和Result。Action是业务逻辑的载体,它接收...

    Struts2源码分析

    总的来说,Struts2的源码分析可以帮助开发者深入理解其内部机制,包括请求处理流程、拦截器的运作方式以及视图组件的实现。这有助于提高应用的可维护性,优化性能,并使开发者能够更好地定制和扩展框架。对于熟悉...

    Struts2之拦截器原理分析及使用-上案例struts007

    拦截器是一个实现了Struts2提供的`Interceptor`接口的类,它定义了两个方法:`intercept()`和`destroy()`。`intercept()`方法是拦截的核心,它会在Action执行前后被调用,允许开发者进行预处理和后处理操作。 在...

    struts2源码分析总结

    这个过滤器实现了`Filter`接口,是Struts2拦截请求并进行处理的第一步。`init`方法是初始化的入口点,其中涉及多个关键步骤: 1. 初始化`InitOperations`类,这是一个代理类,用于执行各种初始化操作。 2. `...

    Struts2视频教程

    #### 六、Struts2源码分析 - **深入源码**:针对某些重要知识点,比如Action的执行流程、拦截器的工作原理等,本教程还会带领学员一起探索源码,加深对框架内部机制的理解。 ### 结语 通过以上对Struts2各个方面...

    struts2小程序 struts2代码

    在`AndroidTest`这个文件名中,虽然不明确,但可能包含了一个Android相关的测试部分,或者是一个使用Struts2实现的接口,用于与Android客户端交互。如果涉及到Android,可能需要了解RESTful API设计、JSON数据交换...

    struts2项目开发

    在 Struts2 项目开发中,需求分析是非常重要的一步。通过对项目的需求分析,可以确定项目的功能需求、性能需求、安全需求等。例如,在个人信息管理系统中,需要分析用户的需求,例如登录与注册、个人基本信息管理、...

    IBM-struts2内部培训资料

    这份"IBM-struts2内部培训资料"包含10个主题,涵盖了Struts2的核心概念和关键特性,对于学习和理解Struts2框架非常有帮助。 首先,让我们逐一探讨这些章节的主要内容: 1. **第一章:struts2认识**:这一章会介绍...

    struts2源代码分析

    下载Struts2的源代码后,可以通过分析其内部结构来深入了解其工作原理。Struts2的源代码组织得非常清晰,主要包括以下几个部分: 1. **`org.apache.struts2.components`**:这个包包含了Struts2的各种视图组件。...

    struts1和struts2的区别

    ### Struts1与Struts2的主要区别 #### 概述 Apache Struts 是一个用于构建企业级Java Web应用的开源框架。它分为两个版本:Struts1 和 Struts2。虽然两者都基于模型-视图-控制器(MVC)设计模式,但它们之间存在...

    Struts2的工作机制原理分析及实例整理.pdf

    ### Struts2的工作机制原理分析及实例整理 #### 一、概述 Struts2作为一款流行的Java Web开发框架,其设计理念和技术实现相比Struts1.x有着显著的不同。尽管两者名称相似,但从架构到实现方式,Struts2都有了质的...

    struts2-core.jar

    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漏洞利用工具2019版 V2.3.zip

    Struts2是一款非常流行的开源Java Web框架,它提供了一种模型-视图-控制器(MVC)架构,帮助开发者构建可维护性和可扩展性良好的Web应用程序。然而,随着时间的推移,Struts2框架出现了一些安全漏洞,这些漏洞可能被...

    struts2 chm 帮助文档

    struts2 chm 程序包 org.apache.struts2 接口概要 接口 说明 StrutsStatics Constants used by Struts. 类概要 类 说明 RequestUtils Request handling utility class. ServletActionContext Web-specific ...

Global site tag (gtag.js) - Google Analytics