`

Container中关联的变量

 
阅读更多
package com.opensymphony.xwork2.inject;

/**
 * Dependency mapping key. Uniquely identified by the required type and name.
 *
 * @author crazybob@google.com (Bob Lee)
 */
class Key<T> {

  final Class<T> type;
  final String name;
  final int hashCode;
  // 注意此处private
  private Key(Class<T> type, String name) {
    if (type == null) {
      throw new NullPointerException("Type is null.");
    }
    if (name == null) {
      throw new NullPointerException("Name is null.");
    }

    this.type = type;
    this.name = name;

    hashCode = type.hashCode() * 31 + name.hashCode();
  }

  Class<T> getType() {
    return type;
  }

  String getName() {
    return name;
  }

  public int hashCode() {
    return hashCode;
  }

  public boolean equals(Object o) {
    if (!(o instanceof Key)) {
      return false;
    }
    if (o == this) {
      return true;
    }
    Key other = (Key) o;
    return name.equals(other.name) && type.equals(other.type);
  }

  public String toString() {
    return "[type=" + type.getName() + ", name='" + name + "']";
  }
  // 注意此处
  static <T> Key<T> newInstance(Class<T> type, String name) {
    return new Key<T>(type, name);
  }
}

 // InternalFactory<T>  定义

package com.opensymphony.xwork2.inject;

import java.io.Serializable;

/**
 * Creates objects which will be injected.
 *
 * @author crazybob@google.com (Bob Lee)
 */
// 接口定义
interface InternalFactory<T> extends Serializable {

  /**
   * Creates an object to be injected.
   *
   * @param context of this injection
   * @return instance to be injected
   */
  T create(InternalContext context);// 注意参数
}

 // InternalContext定义

package com.opensymphony.xwork2.inject;

import java.util.HashMap;
import java.util.Map;

/**
 * Internal context. Used to coordinate injections and support circular
 * dependencies.
 *
 * @author crazybob@google.com (Bob Lee)
 */
class InternalContext {

  final ContainerImpl container;// 注意final
  final Map<Object, ConstructionContext<?>> constructionContexts =
      new HashMap<Object, ConstructionContext<?>>();
  Scope.Strategy scopeStrategy;//
  ExternalContext<?> externalContext;// 冠梁ExternalContext<?>
  
//构造函数定义
  InternalContext(ContainerImpl container) {
    this.container = container;
  }

  public Container getContainer() {
    return container;
  }
//为何这样子定义呢?
  ContainerImpl getContainerImpl() {
    return container;
  }

  Scope.Strategy getScopeStrategy() {
    if (scopeStrategy == null) {
      scopeStrategy = (Scope.Strategy) container.localScopeStrategy.get();

      if (scopeStrategy == null) {
        throw new IllegalStateException("Scope strategy not set. "
            + "Please call Container.setScopeStrategy().");
      }
    }

    return scopeStrategy;
  }

  @SuppressWarnings("unchecked")
  <T> ConstructionContext<T> getConstructionContext(Object key) {
    ConstructionContext<T> constructionContext =
        (ConstructionContext<T>) constructionContexts.get(key);
    if (constructionContext == null) {
      constructionContext = new ConstructionContext<T>();
      constructionContexts.put(key, constructionContext);
    }
    return constructionContext;
  }
//第四个参数 的get set
  @SuppressWarnings("unchecked")
  <T> ExternalContext<T> getExternalContext() {
    return (ExternalContext<T>) externalContext;
  }

  void setExternalContext(ExternalContext<?> externalContext) {
    this.externalContext = externalContext;
  }
}

 //ExtralContext定义

package com.opensymphony.xwork2.inject;

import java.lang.reflect.Member;
import java.util.LinkedHashMap;

/**
 * An immutable snapshot of the current context which is safe to
 * expose to client code.
 *
 * @author crazybob@google.com (Bob Lee)
 */
class ExternalContext<T> implements Context {

  final Member member;//注意此处final
  final Key<T> key;
  final ContainerImpl container;
//此处是public
  public ExternalContext(Member member, Key<T> key, ContainerImpl container) {
    this.member = member;
    this.key = key;
    this.container = container;
  }

  public Class<T> getType() {
    return key.getType();
  }

  public Scope.Strategy getScopeStrategy() {
    return (Scope.Strategy) container.localScopeStrategy.get();
  }

  public Container getContainer() {
    return container;
  }

  public Member getMember() {
    return member;
  }

  public String getName() {
    return key.getName();
  }

  public String toString() {
    return "Context" + new LinkedHashMap<String, Object>() {{
      put("member", member);
      put("type", getType());
      put("name", getName());
      put("container", container);
    }}.toString();
  }
//此处为调用构造函数得到实例
  static <T> ExternalContext<T> newInstance(Member member, Key<T> key,
      ContainerImpl container) {
    return new ExternalContext<T>(member, key, container);
  }
}

 //ConstructContext<T> 在Jdk动态代理中有列出

分享到:
评论

相关推荐

    Linux内核宏container_of的深度剖析

    Linux内核宏`container_of`是Linux内核中一个非常重要的工具,用于在内核代码中根据结构体的成员地址反向查找整个结构体的地址。这个宏在编写内核驱动程序时尤其常见,因为它允许程序员高效地访问与某个特定成员相...

    计算机编程常用英语单词.pdf

    11. Associative Container:关联式容器 关联式容器是一种数据结构,能够将键值对存储在一起。 12. Atomic:不可分割的、原子的 原子是指不能再被分割的最小单位。 13. Attribute:属性、特性 属性是指对象或变量...

    Slides03.pdf

    这意味着C++中的对象变量在内存中直接代表对象,与许多其他语言中的引用或指针概念不同。 5. 按值传递(Pass-by-Value): 在C++中,对象通过值传递给函数。这意味着函数获得其参数的本地副本以供工作使用。虽然在...

    编程英语(单词有音标).docx

    14. 关联式容器(associative container):关联式容器是指在编程中用于存储和管理键值对的数据结构。 15. 原子操作(atomic operation):原子操作是指在编程中能够作为一个整体执行的操作,以确保数据的一致性。 ...

    壬寅朔月的背包和指针-KHIN的讲义(指针,vector,deque部分)

    容器可以分为序列容器(sequence container)和关联容器(associative container)两大类。序列容器中,元素的顺序是固定的,而关联容器中,元素的顺序是根据关键字来确定的。今天,我们主要介绍序列容器中的 vector...

    domino xpages 开发 分类视图view分類展開和閉合.docx

    在数据挖掘、人工智能、机器学习和算法等标签所涉及的领域,尽管直接关联性不强,但这种数据展示技术在数据探索和分析过程中同样重要。例如,通过分类视图,用户可以高效地浏览和筛选大量数据,这对于数据科学家来说...

    Rails 中页面中常用函数

    1. **实例变量访问**:在Rails的控制器中定义的实例变量可以在视图中直接访问。例如,如果在控制器中有`@items = Item.all`,那么在`list.rhtml`中可以通过`|item| %&gt;`遍历这个数组并显示每个元素的信息。 2. **`...

    程序员常用600词汇.docx

    9. Associated Container:关联式容器 Associated Container 是一种容器,它可以存储某种类型的数据,并提供了某些基本操作,例如插入、删除和查找等。 10. Atomic:不可分割的、原子的 Atomic 是指某个操作是不...

    Linux内核链表分析.pdf

    在遍历链表时,由于`entry`在`node`结构体中的声明位置不固定,Linux内核使用了`offsetof`和`container_of`这两个宏来计算结构体成员变量的地址,从而进行遍历。这样做是为了在不知道`entry`位置的情况下,仍能灵活...

    ThinkPHP5.1完全开发手册.pdf

    模型是ThinkPHP的一个重要组成部分,手册中讲解了如何定义模型、模型事件、模型关联(一对一、一对多、多对多、多态关联、关联预载入、关联统计)、关联输出、关联查询等。模型关联功能极大地增强了数据处理的灵活性...

    python术语对照表.docx

    在Python中,注解(Annotation)是一种附加信息,可以关联到变量、类属性、函数参数或返回值,通常用作类型提示。尽管在运行时本地变量的注解不可见,但全局变量、类属性和函数的注解可以通过它们各自的`__...

    学习storyboard的demo

    - Outlets允许将界面上的控件连接到代码中的变量,方便在代码中操控这些控件。 - Actions则将控件的事件(如点击按钮)关联到代码中的方法,实现交互逻辑。 7. **Container Views**: - Container Views用于在同...

    个人的前端开发规范

    在使用jQuery时,通常会在变量名前加上`$`符号,如`$li=$('.container li');`。这有助于快速识别变量是jQuery对象。 变量声明规范: 建议使用`let`关键字来声明变量,而不是`var`,因为`let`具有块级作用域,能避免...

    c++中的set,map,stack的简单用法(csdn)————程序.pdf

    std::stack, Container&gt; stack变量名; ``` 其中,`T`是元素类型,`Container`是可选的,通常默认为`std::deque&lt;T&gt;`。例如,创建一个存储整数的栈: ```cpp std::stack&lt;int&gt; st; ``` 入栈操作使用`push()`: ...

    常用编程英语单词,常用编程英语单词

    associative container(关联式容器):是一种数据结构,用于存储和管理键值对。 atomic(不可分割的):指的是一个不可分割的操作或事务。 attribute(属性):是一种描述对象或变量的特性或特征。 audio(音讯...

    jessibuca+vue+js

    4. **响应式系统**:Vue.js的数据模型是响应式的,通过`data`属性定义的变量改变会自动更新关联的视图。 5. **生命周期**:每个Vue组件都有其特定的生命周期,开发者可以在不同的生命周期钩子函数中执行相应的逻辑。...

    编程英语(单词有音标).pdf

    Associative Container(关联式容器)如字典或映射,通过键来访问元素。Asynchronous(异步的)表示操作非阻塞,允许程序在等待结果时继续执行其他任务。Atomic(原子的)操作是不可分割的,要么全部完成要么完全不...

    一个实例搞定MATLAB界面编程

    GUI的布局管理也是个关键点,MATLAB提供了几种布局策略,如网格布局(`matlab.ui.container.GridLayout`)、盒子布局(`matlab.ui.container.Box`)和面板布局(`matlab.ui.container.Panel`)。合理的布局可以使...

    编译Chapter3 作业答案1

    5. `value`:与键关联的值,如属性值`class="container"`中的`container`。 6. `assign_op`:赋值运算符,如`=`,在处理标签属性时常见。 这些词法单元必须具有相关联的词法值,这意味着它们在程序中扮演特定的角色...

Global site tag (gtag.js) - Google Analytics