Spring beans, BeanFactory, ApplicationContext and IOC

اسپرینگ بین چیست؟به طور خلاصه اشیایی که توسط spring ioc container ساخته و مدیریت میشوند را spring bean میگویند.اسپرینگ از Bean ها به منظور پیاده سازی الکوی طراحی (inversion of control) IOC استفاده میکند که در واقع یکی از مفاهیم اصلی اسپرینگ هست که در ماژول spring core پیاده سازی شده است. اسپرینگ از دو اینترفیس مهم BeanFactory و ApplicationContext برای پیش رسیدن به هدف خود استفاده میکند که در این مقاله بهشون میپردازیم.اما در ابتدا IOC چیه؟ یک الگوی طراحیه که مسولیت ساخت و مدیریت اشیا و تزریق وابستگی (dependency injection) رو از روی دوش کد و برنامه نویس برمیداره و روی دوش فریمورک میذاره.به این معنی که ما وایستگی بین bean ها رو مشخص میکنیم اما این فریمورک هست که اونا رو برای ما میسازه و وابستگی های بین اون ها رو مدیریت و تزریق میکنه.این رویکرد منجر به جدا شدن اشیا، افزایش انعطاف پذیری و بهبود تست پذیری می شود.حالا بیاین راجع به BeanFactory صحبت کنیم. BeanFactory اینترفیس اساسی هست که اسپرینگ برای پیاده سازی تزریق وابستگی ازش بهره میبره.بهش به چشم یک کانتینر که تمام Bean هایی که از طریق configuration به اسپرینگ معرفی کرده ایم رو نگهداری میکنه.در ابتدا BeanFactory تمام Bean ها رو میسازه و دخیره میکنه و هنگام اجرا (run time) شما میتونید یک Bean رو ازش بخواین و اون از این Bean یک شیئ میسازه و یا یکی از اشیا ساخته و ذخیره شده رو بهتون بر میگردونه.مورد بعدی ApplicationContext هست.در واقع یکی از اینترفیس هایست که از BeanFactory ارث بری میکنه که کارایی هایی نظیر internationalization, event handling و resource loading رو بهش اضافه میکنه.این یک راه حل کامل و یکپارچه برای مدیریت اشیا و وابستگی های آنها است.به ویژه در برنامه های کاربردی وب مفیده، جایی که می تونه به طور خودکار فایل های پیکربندی لازم را بر اساس محیط شناسایی و بارگذاری کنه.خوبه که به بعضی از پیاده سازی های مهم ApplicationContext نگاهی بندازیم:شماره یک AnnotationConfigApplicationContext: این پیاده سازی به ما اجازه می ده تا bean ها را با استفاده از annotation ها به جای XML پیکربندی کنیم. مسیر کلاس را برای annotation ها اسکن می کنه و به طور خودکار ونها رو به عنوان Bean در context ثبت می کند .شماره دو ClassPathXmlApplicationContext: این پیاده سازی به ما امکان می دهد با استفاده از یک فایل XML بتوانیم Bean ها را پیکربندی کنیم. فایل XML را می خونه و تمام Bean های تعریف شده در آن را ایجاد و مقداردهی اولیه می کند.شماره سه FileSystemXmlApplicationContext: این پیاده سازی شبیه ClassPathXmlApplicationContext است، اما فایل پیکربندی XML را از سیستم فایل به جای مسیر کلاس می خواند.شماره چهار WebApplicationContext: این پیاده سازی برای برنامه های کاربردی وب طراحی شده است و ویژگی های اضافی مانند پشتیبانی از رسیدگی به درخواست ها و پاسخ های HTTP و همچنین ادغام با چارچوب های وب مانند Spring MVC را ارائه می دهد.در آخر AnnotationConfigWebApplicationContext: شبیه به AnnotationConfigApplicationContext است، اما به طور خاص برای برنامه های کاربردی وب طراحی شده است و ویژگی های اضافی را برای رسیدگی به درخواست های وب ارائه می دهد.حالا بیایید در مورد مراحلی که Spring برای ایجاد یک Bean طی می کند صحبت کنیم:1_ Configuration:اولین قدم در ایجاد Spring bean پیکربندی آن است. این شامل تعریف ویژگی‌ها و وابستگی‌های bean، و همچنین هر روش initialization و destruction است که ممکن است داشته باشد. این مرحله را می توان با استفاده از XML، پیکربندی جاوا یا annotation ها انجام داد.2_Bean Definitionهنگامی که bean پیکربندی شد، Spring یک شی BeanDefinition ایجاد می‌کند که حاوی تمام اطلاعات مورد نیاز برای ایجاد bean است. این شامل کلاس bean، هر آرگومان سازنده، و خصوصیات و وابستگی های آن می شود.3_Bean instantiationسپس Spring از BeanDefinition برای نمونه سازی(instantiate ) bean استفاده می کند، معمولاً از API بازتابی (reflection) جاوا برای ایجاد نمونه ای از کلاس bean استفاده می کند.4_Dependency Injectionهنگامی که Bean نمونه سازی شد، اسپرینگ تزریق وابستگی را انجام می دهد، که شامل مقدار دهی هر ویژگی یا وابستگی ممکن است که Bean داشته باشد. این معمولاً با استفاده از setter ها یا سازنده ها انجام می شود.5_Initializationاگر bean متدهای initialization داشته باشد، Spring آنها را در این مرحله فراخوانی می کند. این روش ها را می توان برای انجام هر گونه کار راه اندازی یا مقداردهی اولیه مورد استفاده قرار داد.6_Useهنگامی که bean به طور کامل مقداردهی اولیه شد، می توان آن را توسط سایر اجزای برنامه استفاده کرد.7_Destructionدر نهایت، اگر Bean متد های تخریبی داشته باشد، اسپرینگ آنها را زمانی فراخوانی می کند که دیگر به Beanنیازی نباشد. از این روش ها می توان برای انجام هر گونه کار پاکسازی ضروری استفاده کرد.به طور خلاصه، درک BeanFactory، ApplicationContext و IoC برای ساخت برنامه‌های Spring مقیاس‌پذیر و قابل نگهداری بسیار مهم است. این ابزارهای قدرتمند به شما کمک می‌کنند تا اجزای ماژولار و قابل استفاده مجدد ایجاد کنید که می‌توانند به هم متصل شوند تا یک برنامه کامل را تشکیل دهند. با کانتینر IoC Spring و پیاده سازی های تخصصی ApplicationContext، می توانید فرآیند توسعه خود را ساده کنید و برنامه های کاربردی انعطاف پذیر، مقیاس پذیر و با قابلیت نگهداری آسان بسازید.