在软件开发过程中,context 的含义取决于所处的具体场景,但简单来说,它代表执行代码所在的环境信息和上下文。
几个常见的 context 概念:
- 执行上下文(Execution Context) 代码执行时的状态,包括线程、栈帧、变量绑定等信息。例如在多线程环境中,每个线程有自己的执行上下文。
- 应用上下文(Application Context) 应用程序运行所在的整体环境,包括配置、资源、全局信息等。例如 Spring 的 ApplicationContext 就是管理 bean 的容器环境。
- 图形上下文(Graphics Context) 绘制图形时的状态信息,比如 coordinate system、drawing color 等。用于保证图形绘制的一致性。
- 安全上下文(Security Context) 安全相关的信息,如用户身份、权限、认证状态等。用于进行访问控制。
- 对话上下文(Conversation Context) 对话过程中的临时共享信息,用于不同模块之间传递消息。例如机器人对话需要理解上下文信息。
- HTTP 上下文 HTTP 请求的环境,包括请求方法、头信息等。Web 应用根据请求上下文进行路由、验证等操作。
所以 context 代表代码执行所在的环境信息,通过保存上下文可以更好地理解程序运行背后所需的依赖关系和状态。适时使用 context 机制可以提升软件模块性、健壮性及安全性.
在实际开发过程中,可以通过以下方式使用 context:
1. 依赖注入(DI)容器
Spring等框架使用ApplicationContext作为依赖注入容器,在启动时解析依赖关系,并保存各个bean的实例。在运行时可以直接从context获取bean,而不需要手动创建或查找依赖了。
2. 线程上下文
在多线程环境下,可以使用ThreadLocal或传入参数的方式,给每个线程绑定自己的执行上下文。例如用户身份信息就可以绑定到线程上下文,避免频繁获取。
3. 请求上下文
在处理HTTP请求时,框架会创建一个请求上下文对象,并在filter/interceptor中Populated各种信息,如请求参数、用户身份、头信息等。后续处理器可以直接使用这些上下文信息。
4. 数据库连接上下文
通过线程绑定或者参数传递,提供当前线程/操作使用的数据库连接对象。避免在方法中频繁获取连接。
5. 全局静态上下文
有些全局信息,如应用配置、资源文件句柄等,初始化后不会改变,可以存储在类静态变量或单例context中,供各处获取。
6. 日志上下文
在日志记录时,保存当前日志相关信息,如请求id,方便日志聚合及追踪。
所以上下文主要通过依赖注入、线程绑定和参数传递这些方式实现,可以避免高频获取依赖,提升性能。但使用时也需要注意同步及内存开销,取舍合理的方案。