ابوالفضل مدت زیادی است که با فریمورک Spring Boot کار میکند. اخیراً او به این فکر فرو رفته که قابلیتهای مختلف این فریمورک چگونه کار میکنند. برای درک عمیقتر این موضوع، او میخواهد بداند قابلیت autowiring که تزریق وابستگی (dependency injection) خودکار با استفاده از آن انجام میشود چگونه کار میکند. از شما میخواهیم نسخهی سادهای از این بخش فریمورک Spring Boot را برای او بنویسید.
پروژهی اولیه را از این لینک دانلود کنید. ساختار فایلهای پروژه بهصورت زیر است:
@Component
🔗از این انوتیشن در کلاسهایی استفاده میشود که بخواهیم امکان استفاده از آنها در تزریق وابستگی خودکار فراهم باشد. این انوتیشن شامل پارامتر value
از نوع String
است.
@Autowired
🔗از این انوتیشن زمانی استفاده میشود که بخواهیم کانستراکتور موردنظر را جهت فراخوانی هنگام تزریق وابستگی خودکار مشخص کنیم. اگر کلاس موردنظر تنها شامل یک کانستراکتور باشد، نیازی به استفاده از این انوتیشن نیست. در غیر اینصورت، فقط یکی از کانستراکتورهای کلاس باید دارای این انوتیشن باشد.
@Qualifier
🔗از این انوتیشن زمانی استفاده میشود که بخواهیم از بین چند پیادهسازی برای یک اینترفیس یا کلاس، یکی را برای autowiring انتخاب کنیم. این انوتیشن شامل پارامتر value
از نوع String
است.
Injector
🔗این کلاس، وظیفهی اصلی قابلیت autowiring را برعهده دارد. این کلاس شامل متدی با نام get
و با امضای زیر است:
این متد را بهگونهای پیادهسازی کنید که با دادن یک کلاس به آن، یک نمونه از آن کلاس ساخته شود. همچنین، کلاس دادهشده میتواند شامل یک یا چند کانستراکتور باشد.
نکات زیر هنگام پیادهسازی متد get
باید رعایت شوند:
public
نبود، یک استثنا از نوع NoPublicConstructorFoundException
پرتاب کنید.@Autowired
بودند، یک استثنا از نوع NoUniqueConstructorFoundException
پرتاب کنید.@Qualifier
نبودند، یک استثنا از نوع NoUniqueComponentFoundException
پرتاب کنید (برای مثال، اگر اینترفیسی با نام IA
داشته باشیم و دو پیادهسازی A1
و A2
از آن داشته باشیم که مقدار موجود در @Component
آنها یکسان باشد).@Component
با value
یکسان برای بیش از یک پیادهسازی برای یک اینترفیس یا کلاس وجود داشت، یک استثنا از نوع NoUniqueComponentFoundException
پرتاب کنید.A
در کانستراکتور خود یک آبجکت از نوع B
لازم داشته باشد و کلاس B
در کانستراکتور خود یک آبجکت از نوع A
لازم داشته باشد)، یک استثنا از نوع CircularDependencyFoundException
پرتاب کنید.get
کلاس Injector
و هنگام بررسی آبجکتهای موردنظر جهت ساخت صورت گیرد.Injector
تعریف کنید.get
کلاس Injector
استفاده نمیشود.پس از پیادهسازی متد get
، فایل Injector.java
را آپلود کنید.