The Dependency Injector is a mature, feature-rich dependency injection framework for Python. It provides core DI patterns through providers (Factory, Singleton, Resource, etc.), containers (Declarative/Dynamic), and wiring mechanisms (@inject decorator). The framework emphasizes explicit dependency declaration, testability, and loose coupling while supporting async/await, configuration management from multiple sources, and runtime provider overriding. It includes framework-specific integrations (Flask, Django, FastAPI, etc.) via its wiring module and extension system, though the core remains framework-agnostic. Architecturally, the codebase separates concerns into distinct modules: providers handle object creation/lifecycle, containers manage provider resolution and hierarchy, wiring enables automatic dependency injection into functions/methods, resources manage lifecycle-dependent objects (e.g., DB connections), and configuration providers unify settings from YAML/INI/JSON/env. The framework uses Cython for performance-critical components while maintaining a pure Python interface. Comprehensive documentation, extensive test suite, and numerous examples demonstrate practical integration patterns across web applications, daemons, and cloud services. The project shows strong maintenance with frequent releases, active issue triage, and broad Python version support (3.8-3.14). Technical drift is low due to proactive dependency updates, removal of deprecated Python versions, and adherence to modern Python practices. The codebase exhibits high craftsmanship in its provider patterns, particularly the Resource provider's context-manager semantics and the wiring module's automatic dependency resolution, making it a reusable dependency injection solution for Python applications.
This repository provides TransmittableThreadLocal (TTL), a Java library that extends InheritableThreadLocal to propagate thread-local values across threads even when using thread pools, executors, ForkJoinPool, and other asynchronous constructs. It solves the common problem of context loss (e.g., tracing, security, session) in asynchronous Java applications. The library offers three usage modes: manual wrapping of Runnable/Callable via TtlRunnable/TtlCallable, wrapping executors via TtlExecutors, and transparent bytecode transformation via a Java Agent (TtlAgent) that automatically instruments JDK thread pool classes. The architecture is modular: ttl-core contains the core API and CRR (Capture-Replay-Restore) pattern, ttl-agent provides the agent with Javassist-based transformlets, ttl-kotlin adds Kotlin extensions, and ttl-integrations includes Vert.x 3/4 support. A ttl2-compatible module maintains backward compatibility with the v2 API. The library is widely adopted in the Java ecosystem (e.g., Apache ShardingSphere, SOFARPC) and is under active development with a v3 branch introducing a refined API. While primarily a library, it includes a Java Agent component that operates at the JVM level, making it a hybrid of library and instrumentation tool.