حاويات حقن التبعية (Dependency Injection) لجافا: نظرة شاملة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

حاوية حقن التبعية (Dependency Injection) لجافا: ما هي ولماذا نحتاجها؟

\n\n

في تطوير جافا الحديث، أحد المبادئ الأساسية للتصميم هو حقن التبعية (DI) — وهو نمط يحصل فيه الكائن على تبعياته من الخارج، بدلاً من إنشائها بنفسه. لأتمتة هذه العملية، تُستخدم حاويات حقن التبعية — وهي مكتبات تدير دورة حياة الكائنات وعلاقاتها.

\n\n

حاوية DI (وتسمى أيضًا حاوية عكس التحكم (IoC)) تتولى إنشاء مكونات التطبيق وتهيئتها وربطها. وهذا يسمح بـ:

\n\n
    \n
  • تقليل الترابط بين الكود (loose coupling)
  • \n
  • تبسيط الاختبار (استبدال التبعيات بسهولة بكائنات وهمية)
  • \n
  • زيادة إمكانية إعادة استخدام المكونات
  • \n
  • إدارة التهيئة بشكل مركزي
  • \n
\n\n

كيف تعمل حاوية DI؟

\n\n

المهمة الرئيسية للحاوية هي ربط الواجهات بتطبيقاتها. تتضمن العملية عادةً ثلاث مراحل:

\n\n
    \n
  1. تسجيل التبعيات — تتعرف الحاوية على الفئات والواجهات المتاحة
  2. \n
  3. حل التبعيات — عند إنشاء كائن، تقوم الحاوية بتحليل المُنشئ أو الحقول الخاصة به
  4. \n
  5. الحقن — تقوم الحاوية بإنشاء نسخ من التبعيات وتمريرها إلى الكائن الهدف
  6. \n
\n\n

لنلقِ نظرة على مثال بسيط بدون حاوية:

\n\n
public class UserService {\n    private UserRepository repository;\n\n    public UserService() {\n        // ارتباط صارم — إنشاء التبعية يدويًا\n        this.repository = new UserRepositoryImpl();\n    }\n}
\n\n

باستخدام حاوية DI (على سبيل المثال مع Spring):

\n\n
@Service\npublic class UserService {\n    private final UserRepository repository;\n\n    // الحقن عبر المُنشئ\n    @Autowired\n    public UserService(UserRepository repository) {\n        this.repository = repository;\n    }\n}
\n\n

ستقوم الحاوية بإنشاء نسخة من UserRepositoryImpl وتمريرها إلى المُنشئ.

\n\n

حاويات DI الشائعة لجافا

\n\n

توجد عدة حلول ناضجة في سوق جافا. دعنا نستعرض أهمها:

\n\n

1. Spring Framework / Spring Boot

\n

أشهر حاوية DI. تستخدم التعليقات التوضيحية (@Component, @Service, @Repository) أو تهيئة XML. تدعم:

\n
    \n
  • المسح التلقائي للحزم (component scanning)
  • \n
  • الملفات الشخصية والتبعيات الشرطية
  • \n
  • إدارة دورة حياة الحبوب (singleton, prototype وغيرها)
  • \n
  • AOP (البرمجة الموجهة نحو الجوانب)
  • \n
\n\n
@Configuration\npublic class AppConfig {\n    @Bean\n    public UserRepository userRepository() {\n        return new UserRepositoryImpl();\n    }\n\n    @Bean\n    public UserService userService() {\n        return new UserService(userRepository());\n    }\n}
\n\n

2. Google Guice

\n

حاوية DI خفيفة وسريعة من Google. تستخدم الوحدات النمطية والتعليق التوضيحي @Inject.

\n
public class MyModule extends AbstractModule {\n    @Override\n    protected void configure() {\n        bind(UserRepository.class).to(UserRepositoryImpl.class);\n    }\n}\n\npublic class Main {\n    public static void main(String[] args) {\n        Injector injector = Guice.createInjector(new MyModule());\n        UserService service = injector.getInstance(UserService.class);\n    }\n}
\n\n

3. Dagger 2

\n

يُولد الكود في مرحلة الترجمة، مما يعطي أداءً أقصى. يُستخدم غالبًا في تطوير Android.

\n
@Component\npublic interface AppComponent {\n    UserService getUserService();\n}\n\n@Module\npublic class AppModule {\n    @Provides\n    UserRepository provideUserRepository() {\n        return new UserRepositoryImpl();\n    }\n}\n\n// الاستخدام\nAppCompon                    

توصيات