dependency injection یک الگوی طراحی است که هدفش حذف بیان وابستگی های بین دو کلاس با استفاده از کد است به مثال زیر در جاوا توجه کنید، وقتی Class1 به Class2 وابستگی دارد ما این وابستگی را با تعریف یک فیلد از Class2 در Class1 تعریف می کنیم و سپس با استفاده از کلمه کلیدی new یک شئ از Class2 می سازیم:
public class Class1 {
public Class2 class2 = new Class2();
}
حالا کل حرف الگوی طراحی dependency injection این است که استفاده از کلمه کلیدی new بیان وابستگی بین دو کلاس بصورت hard code است و می توان آن را بصورتی تغییر داد که این وابستگی توسط یک ابزار یا framework دست بالایی بصورت داینامیک در زمان کامپایل یا اجرا درون برنامه تزریق (inject) شود. برای مثال در جاوا با استفاده از framework های dependency injection مانند Spring می توان کد بالا را به صورت زیر تغییر داد:
public class Class1 {
public Class2 class2;
}
و سپس باید با استفاده از تنظیمات XML (یا annotation) که Spring در اختیار شما قرار می دهد وابستگی بین این دو کلاس را تعریف کرد و در نهایت Spring در زمانی که شما مشخص کرده اید یک شئ از کلاس Class2 می سازد و درون متغییر class2 قرار می دهد.
اما در جواب قسمت دوم سوال شما باید بگم که در مورد زبان جاوا خیر لزومی ندارد حتما از framework های dependency injection استفاده کنید و می توانید خودتان با استفاده از reflection و annotation and xml processing این کار را انجام دهید ولی من اکیدا این کار را بدلیل هزینه و نیاز به دانش بالا توصیه نمی کنم.