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动态代理中有列出

<think>我们正在讨论如何在YAML文件中引用Kubernetes Secret。根据用户的问题,我们需要在YAML配置文件中使用Secret。通常,有两种主要方式: 1. 将Secret作为环境变量注入到容器中。 2. 将Secret挂载为卷。 根据提供的引用,特别是引用[2]中提到Secret用于存储敏感信息,并且提供了一种安全灵活的方式来管理这些信息。引用[1]和引用[3]则展示了如何查看和删除Secret,但没有直接展示如何在YAML中引用。引用[5]提到了YAML配置文件的灵活性和可维护性,并提到了变量引用。 因此,我们将重点介绍如何在YAML文件中引用Secret。 ### 步骤1:创建Secret 在引用之前,需要先创建Secret。例如,我们有一个名为`db-secret`的Secret,其中包含用户名和密码: ```yaml apiVersion: v1 kind: Secret metadata: name: db-secret type: Opaque data: username: dXNlcm5hbWU= # base64编码的字符串 password: cGFzc3dvcmQ= ``` ### 步骤2:在Pod的YAML中引用Secret #### 方法一:作为环境变量 在Pod的配置中,我们可以通过环境变量来引用Secret: ```yaml apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mycontainer image: myimage env: - name: DB_USERNAME valueFrom: secretKeyRef: name: db-secret # 指定Secret的名称 key: username # 指定Secret中的键 - name: DB_PASSWORD valueFrom: secretKeyRef: name: db-secret key: password ``` #### 方法二:挂载为卷 也可以将Secret挂载到容器内的某个目录下: ```yaml apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: mycontainer image: myimage volumeMounts: - name: secret-volume mountPath: /etc/secret readOnly: true volumes: - name: secret-volume secret: secretName: db-secret # 指定Secret的名称 # 可选:指定要包含的键,如果不指定则包含所有键 items: - key: username path: db-username - key: password path: db-password ``` 这样,Secret中的`username`会被存储在`/etc/secret/db-username`文件中,`password`会被存储在`/etc/secret/db-password`文件中。 ### 注意事项 - 在YAML中引用Secret时,确保Secret已经存在(在创建Pod之前创建好Secret)。 - 使用环境变量时,请注意:如果Secret被更新,环境变量不会自动更新,除非重启Pod。而挂载为卷的方式,Secret更新后,卷中的文件也会更新(可能需要一定时间,通常几分钟内)。 - 数据在Secret中是以base64编码存储的,但在注入到环境变量或挂载为文件时,容器内获取的是解码后的原始数据。 ### 引用说明 在Kubernetes中,通过YAML文件引用Secret是一种常见的做法,它符合配置即代码的理念,提高了配置的可维护性和可重复性[^5]。 §§相关问题§§ 1. 如何创建Kubernetes Secret? 2. 在Kubernetes中,如何更新Secret,更新后Pod如何获取最新值? 3. Kubernetes Secret和ConfigMap有什么区别?</think>### Kubernetes YAML 中引用 Secret 的方法 在 Kubernetes YAML 文件中引用 Secret 主要有两种方式,下面分别说明具体实现方法: #### 1. **作为环境变量注入容器** ```yaml apiVersion: v1 kind: Pod metadata: name: myapp-pod spec: containers: - name: app-container image: myapp:latest env: - name: DB_USERNAME # 容器内环境变量名 valueFrom: secretKeyRef: name: db-secret # Secret 名称 key: username # Secret 中的键名 - name: DB_PASSWORD valueFrom: secretKeyRef: name: db-secret key: password ``` #### 2. **挂载为卷(文件形式)** ```yaml apiVersion: v1 kind: Pod metadata: name: myapp-pod spec: containers: - name: app-container image: myapp:latest volumeMounts: - name: secret-volume # 卷名称 mountPath: "/etc/secrets" # 容器内挂载路径 readOnly: true volumes: - name: secret-volume secret: secretName: db-secret # Secret 名称 # 可选:指定包含的键(默认包含所有键) items: - key: username path: db-user # 在卷中的文件名 - key: password path: db-pwd ``` ### 关键说明 1. **Secret 必须先存在** 在部署 Pod 前需确保 Secret 已创建(可通过 `kubectl get secret` 验证)[^1][^3]。 2. **数据访问方式** - 环境变量方式:容器内通过 `os.getenv("DB_USERNAME")` 访问 - 卷挂载方式:容器内通过读取文件获取(如 `/etc/secrets/db-user`) 3. **安全建议** - 敏感数据始终使用 Secret 而非直接写在 YAML 中 - 设置卷挂载为 `readOnly: true` - 通过 RBAC 限制 Secret 访问权限[^2] 4. **更新机制** - 环境变量方式:Secret 更新后需重启 Pod 才能生效 - 卷挂载方式:Secret 更新后会自动同步(约 1-2 分钟延迟) > 提示:完整 YAML 结构可参考 Kubernetes 官方文档[^5],Secret 的创建方法见引用[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值