
چارچوب بهار چیست؟
Spring Framework یا به طور ساده Spring یکی از محبوب ترین فریم ورک ها برای ایجاد برنامه های کاربردی وب در جاوا است. چارچوب مانند یک کتابخانه است (شاید شما بیشتر با این اصطلاح آشنا باشید)، اما چیزی وجود دارد که باید در نظر بگیرید. به طور کلی، وقتی از یک کتابخانه استفاده میکنید، به سادگی نمونههایی از کلاسهای موجود در آن ایجاد میکنید، متدهای مورد نیاز خود را فراخوانی میکنید و در نتیجه به نتیجهای که نیاز دارید میرسید. به عبارت دیگر، این رویکرد ضروری تر است: در برنامه خود، شما به صراحت لحظه خاصی را مشخص می کنید که باید کدام شی را ایجاد کنید، چه زمانی باید کدام متد خاص را فراخوانی کنید، و غیره. در چارچوب ها، همه چیز کمی متفاوت است. شما به سادگی چند کلاس از خود می نویسید و مقداری منطق در آنها می نویسید، اما سپس خود فریم ورک نمونه هایی از کلاس های شما را ایجاد می کند و متدهای آنها را فراخوانی می کند. کلاسهای شما معمولاً برخی از اینترفیسها را از فریمورک پیادهسازی میکنند یا برخی از کلاسهای آن را به ارث میبرند، بنابراین برخی از عملکردهایی را که قبلاً برای شما نوشته شده است، در اختیار شما قرار میدهند. اما همیشه اینطور نیست. به عنوان مثال، اسپرینگ تا حد امکان سعی میکند از چنین جفتگیری محکمی اجتناب کند (جایی که کلاسهای شما مستقیماً به کلاسها/اینترفیسها در چارچوب بستگی دارند). برای رسیدن به این هدف از حاشیه نویسی استفاده می کند. بعداً به این موضوع باز خواهیم گشت. اما درک این نکته مهم است که Spring فقط مجموعهای از کلاسها و رابطهایی است که برای استفاده در دسترس شما هستند :) همچنین میخواهم فوراً خاطرنشان کنم که Spring میتواند نه تنها برای برنامههای تحت وب، بلکه برای رایجترین برنامههای کنسول نیز استفاده شود. که برای همه ما آشناست و حتی امروز یکی از آنها را می نویسیم.ساختار
اما Spring فقط یک چارچوب خاص نیست. بلکه یک نام رایج برای اشاره به چندین فریمورک کوچک است که هر کدام نوع خود را انجام می دهند.
https://docs.spring.io/spring/docs/4.3.26.RELEASE/spring-framework-reference/htmlsingle/
شکل 2.1. مروری بر چارچوب بهار
- دسترسی به داده ها
- وب
- هسته
- و بیشتر
چرا جاوا فریم ورک Spring دارد؟
خوب، علاوه بر این که شیک، شیک و تازه است، همین الان می توانم بگویم که به محض اینکه مهارت کمی در استفاده از Spring بدست آورید، متوجه خواهید شد که چگونه انواع کار وجود دارد که دیگر ندارید. انجام دادن، و چقدر کار بهار بر عهده خود است. میتوانید چند خط تنظیمات پیکربندی بنویسید و چند کلاس بنویسید، و در نهایت با یک پروژه کار میکنید. اما به محض اینکه شروع به تعجب کردید که چه مقدار چیز در زیر هود است، چه مقدار کار در حال انجام است و چه مقدار کد باید بنویسید اگر می خواهید همان پروژه را بر اساس سرورهای ساده یا سوکت ها و جاوا خالص پیاده سازی کنید. موهای شما سیخ خواهد شد :) بهار حتی به عنوان نوعی جادو توصیف می شود. وقتی میبینید که همه چیز کار میکند، این را تجربه میکنید، اما همچنین تصور تقریبی از نحوه و مقدار کار در پشت صحنه دارید - بنابراین به نظر میرسد که واقعاً نوعی جادو در عمل وجود دارد :) بهتر است آن را جادو بنامید. به جای اینکه سعی کنید توضیح دهید که چگونه همه چیز به هم مرتبط است. :) دومین استدلال به نفع مطالعه بهار این است که تقریباً 90٪ از فرصت های شغلی برای توسعه دهندگان جوان (براساس مشاهدات شخصی من) به دانش یا حداقل یک ایده کلی از آنچه که Spring's ، , و ماژول ها به توسعه دهندگان پیشرفته ارائه می دهندData
نیاز Web MVC
دارد Security
:) اما امروز فقط در مورد اصول اولیه است.
DI/IoC
اگر تا به حال سعی کرده اید در مورد Spring مطالعه کنید، اولین چیزی که با آن مواجه شدید احتمالاً این کلمات اختصاری است: DI/IoC. اکنون به شدت توصیه می کنم که از این مقاله فاصله بگیرید و این مقاله DZone را بخوانید ! IoC مخفف Inversion of Control است. من قبلاً به این موضوع اشاره کردم وقتی نوشتم که استفاده از کتابخانه شامل این می شود که شما در کد خود مشخص کنید که کدام روش را روی کدام شیء فراخوانی کنید، اما استفاده از یک چارچوب عموماً به این معنی است که فریم ورک در زمان مناسب کد شما را فراخوانی می کند. به عبارت دیگر، در این مورد اخیر، شما دیگر فرآیند اجرای کد/برنامه را مدیریت نمیکنید - چارچوب این کار را برای شما انجام میدهد. شما کنترل را به چارچوب (وارونگی کنترل) منتقل کردید. DI مخفف Dependency Injection است . با تزریق وابستگی، در روش اصلی اشیاء گربه ایجاد نمی کنید و سپس آنها را به روش های خود منتقل نمی کنید. در عوض، Spring Framework آنها را برای شما ایجاد می کند. شما به سادگی می گویید "من می خواهم یک گربه اینجا بگیرم" و چارچوب در روش شما یکی را به شما منتقل می کند. این مخفف را در مقالات بعدی خواهیم دید.لوبیا و زمینه
یکی از مفاهیم کلیدی در بهار، لوبیا است. در واقع، این فقط یک شی از یک کلاس است. فرض کنید برنامه ای داریم که به 3 شیء نیاز دارد: یک گربه، یک سگ و یک طوطی. و ما دسته ای از کلاس ها با دسته ای از متدها داریم. گاهی برای یک روش به گربه نیاز داریم، گاهی برای روشی دیگر به سگ نیاز داریم و گاهی اوقات روش های ما هم به گربه و هم به طوطی نیاز دارند (مثلا روش غذا دادن به گربه ها-ها). برای روش های دیگر، هر سه شی مورد نیاز است. بله، ابتدا میتوانیم این سه شی را در متد main ایجاد کنیم و سپس به کلاسهای خود منتقل کنیم و سپس در داخل این کلاسها آنها را به متدهای مربوطه منتقل کنیم... و به همین ترتیب در کل برنامه. اما اگر همچنین فرض کنیم که گهگاه میخواهیم لیست پارامترهای ورودی را برای متدهای خود تغییر دهیم (مثلاً تصمیم میگیریم چیزی را بازنویسی کنیم یا عملکرد جدیدی اضافه کنیم)، باید تغییرات زیادی در کد ایجاد کنیم. و حالا تصور کنید که ما نه 3، بلکه 300 شیء از این دست داریم. یک جایگزین این است که همه اشیاء خود را در یک لیست جمع آوری کنیم (List<Object>
)، آن را به هر متد ارسال کنیم و سپس در داخل متدها، شی لازم را دریافت کنیم. اما همانطور که برنامه اجرا می شود، اگر یک شی به این لیست اضافه شود چه می شود، یا بدتر از آن، اگر یکی حذف شود چه؟ این پتانسیل را دارد که هر روشی را که در آن از یک شاخص برای دریافت اشیاء از لیست استفاده می کنیم، شکسته شود. برای جلوگیری از این مشکل، تصمیم می گیریم اشیاء خود را نه در یک لیست، بلکه در نقشه ذخیره کنیم، جایی که کلید نام شی و مقدار خود شی است. این به ما این امکان را می دهد که اشیایی را که نیاز داریم به سادگی با استفاده از نام آنها بازیابی کنیم، به عنوان مثال get("طوطی")، و در پاسخ، شی طوطی را دریافت می کنیم. یا کلید می تواند کلاس شی باشد و مقدار می تواند خود شی باشد. در این مورد، به جای تعیین نام شیء، اما فقط می تواند کلاس شی مورد نیاز خود را مشخص کند. این نیز راحت است. یا حتی میتوانیم نوعی پوشش برای نقشه بنویسیم، جایی که برخی از متدها اشیاء را با نام خود دریافت میکنند و متدهای دیگر، اشیاء را با کلاس خود دریافت میکنند. آنچه ما در اینجا به آن رسیدیم، یک زمینه کاربردی در چارچوب Spring نامیده می شود. زمینه مجموعه ای از لوبیا (اشیاء) است. ما به یک متن دسترسی داریم تا لوبیا (شیء) مورد نیاز خود را با نام، نوع آن یا به وسیله دیگری بدست آوریم. علاوه بر این، میتوانیم از خود Spring بخواهیم که در زمینهی خود به دنبال bean مورد نیاز ما برود و آن را به روش ما منتقل کند. برای مثال، فرض کنید روشی مانند این داشتیم:
public void doSomething(Cat cat) {
...
}
وقتی اسپرینگ این متد را فراخوانی کرد، شی گربه ما را از بافت آن برداشت و به متد ارسال کرد. اما حالا تصمیم گرفتیم که روش ما علاوه بر گربه، به طوطی هم نیاز دارد. با بهار، هیچ چیز نمی تواند آسان تر باشد! ما به سادگی می نویسیم:
public void doSomething(Cat cat, Parrot parrot) {
...
}
حالا وقتی اسپرینگ متد ما را فراخوانی می کند، نیاز به پاس دادن به یک گربه و یک طوطی را می فهمد، بنابراین به متن خود می رود، این دو شی را دریافت می کند و آنها را به متد ما منتقل می کند. با انتقال افسار کنترل به Spring، مسئولیت ایجاد اشیاء و انتقال آنها را نیز به متدهای خود که اسپرینگ فراخوانی خواهد کرد، واگذار می کنیم. این سؤال پیش میآید: چگونه بهار میداند کدام اشیاء (لوبیا) را ایجاد کند؟
راه های پیکربندی برنامه
سه راه اصلی برای پیکربندی یک برنامه وجود دارد ، یعنی روشهایی که به Spring دقیقاً به کدام اشیاء نیاز داریم:- فایل های پیکربندی XML
- پیکربندی مبتنی بر جاوا
- پیکربندی خودکار
- روش با اولویت بالا، که باید ترجیح داده شود، پیکربندی خودکار است
- اگر نمی توان از پیکربندی خودکار برای پیکربندی صحیح همه دانه های ممکن استفاده کرد، از پیکربندی مبتنی بر جاوا (که شامل ایجاد اشیاء با استفاده از کد جاوا است) استفاده کنید.
- و روش با کمترین اولویت روش قدیمی است - با استفاده از فایل های پیکربندی XML.
GO TO FULL VERSION