# فناوری جاوا > برنامه‌نویسی جاوا > سوال: مفاهیم فریمورک spring

## alireza19330

با سلام خدمت دوستان
می خواستم از دوستان با تجربه تر بخوام که مفاهیم پایه فریمورک spring رو به طور خلاصه و عملی بیان کنند
یعنی خودم که خوندم یه چیزایی دستگیرم شد و زیاد قابل لمس نیست واسم
مفاهیمی مثل : IoC یا همون  dependency Injection و Aspect Oriented Programming و bean و ...
با تشکر

----------


## alireza19330

کسی نیست که مرا یاری کند؟

----------


## senior_foe

سلام
من در زمینه Spring با تجربه نیستم. لذا فکر کنم نظر خوب و پخته ای نمی تونم بدم.
اما جدیدا یه کتابچه خیلی خوب به نام Just Spring از انتشارات O'reilly چاپ شده که ۶۰ صفحه هست!! و مغز Spring رو توضیح می ده. همه این مفاهیمی که می خوای تو اون توضیح داده شده. (Bean Factory و IoC و Messaging و ... اما Aspect Oriented رو یادم نیست.)
تو یه نصف روز هم میشه تفریحی خوندش.

امیدوارم به دردت بخوره.

----------


## ناصرقلی

اسپرینگ در اصل یک فریم ورک IOC یا Dependency Injection است. در مورد این مفهوم می توانی در اینترنت مستقلا مطالبی بیابی . فریم ورکهای دیگری هم برای این کار وجود دارند. 
اما اسپرینگ به دلیل اینکه امکان IOC را فراهم می کند از همین طریق امکانات اضافی دیگری را هم فراهم می کند مثل AOP ,  remoting , clustering , ... اما باید توجه داشته باشید کار اصلی آن همان IOC است. شما ابتدا باید این مفهوم را درک کرده و فراگیرید.  
برنامه نویسی AOP هم ماجرای خودش را دارد که باید مستقلا در این مورد تحقیق کنید.
اسپرینگ این امکانات را به صورتی در خود پیاده سازی کرده که معمار سیستم می تواند بدون درگیر شدن با کدهای نوشته شده توسط برنامه نویسان سیستم معماری سیستم را تا حدی تغییر داده و دستکاری کند و مسایلی چون ارتباط با سیستم های خارجی از طریق Web Service ,RMI,JMS , ... اصلا توسط برنامه نویسان دیده نشوند و همچنین امکان افزودن یا حذف تکنولوژی های مختلف را به نرم افزار با کمترین تغییرات در خود دارد.
اسپرینگ رایج ترین نمونه از این نوع فریم ورکها در دنیای جاواست اما فریم ورکهای دیگری هم وجود دارند . JBoss Seam یکی از رقبایش است که البته رویکردش ارایه یک فریم ورک یکسان از لایه واسط کاربر تا دیتابیس بوده و بر خلاف اسپرینگ چندان سعی در انعطاف پذیری نداشته است. گوگل هم محصولی در همین رابطه دارد.
در اسپرینگ  سعی شده همه تکنولوژی ها به ساده ترین صورت و ترجیحا بدون تاثیر گذاشتن بر ساختار نرم افزار قابل استفاده باشند.
 در دنیای جاوا معمولا اول مفاهیم مطرح می شوند و بعد پیاده سازی های متعدد از آن ارایه می شوند (نه مثل دنیای دات نت که معمولا یک مفهوم همراه با تنها پیاده سازی آن ارایه می شود و همه مفهوم را معادل هما پیاده سازی می فهمند) 
http://martinfowler.com/articles/injection.html

----------


## mortezaadi

منابع spring خیلی زیاده ! حتی میتونید مستندات خود سایت SpringSource را مطالعه کنید که بسیار جامع و کامله ولی اگه خیلی ساده بخواهم جواب بدم

IoC : در واقع شالوده spring هست که نحوه instance گرفتن از کلاس ها و رابطه بین اونها رو ( با استفاده از DI) مدیریت میکنه
bean : شما به بین مثل یک Object نگاه کنید در واقع ما دو جورد بین داریم Managed و un-managed هر Bean که توسط IoC مدیریت میشه بهش میگن Managed bean  
در ضمن این بین ها هم طول عمر دارند هم نوع instance گرفتنشون میتونه متفاوت باشه ( singletone یا prototype و....)
Aspect Oriented Programming : بعضی وقتها نیاز دارید کاری رو در طول n کلاس یا n متد انجام بدید مثلا میخواهید قبل از اجرای query کانشکش رو باز کنید query را اجرا کنید و کانکشن رو ببندید!
شما میتونید یک aspect بنویسید که مثلا هر جایی در هر کلاسی اگه تابعی بود که با Save شروع میشد بیاد کانشکشن رو باز کنه اون تابع رو اجرا کنه بعد کانکشن رو ببنده
اینطوری لازم نیست کد باز و بسته کردن کانکشن رو در همه کلاسها کپی کنی
dependency Injection : که مهمترین اصل اسپریگ میباشد برای کم کردن ( ازبین بردن) وابستگی کلاس ها به یکدیگر بوجود اومده مثلا اگه شما کلاسی به نام Car داشته باشید و یک کلاس از نوع engine 
بعد بخواهید در برنامه یک Object داشته باشید از ماشین که یک engine داشته باشده

کلاس هاتون باید اینطور باشند

public class Car {
private Engine engine;
public Car(Engine engine){
thins.engine=engine;
}
}


بعد هرجا نیاز دارید Car myCar = new Car(new Engine();

با اینکار شما کلاس car رو به کلاس engine وابسطه کردید
با کمک DI شما کلاس Car رو جدا مینویسید کلاس  Engine رو جدا و در فایل XMl یا Annotation ارتباط بین این دو رو تعریف میکنید و IoC  براتون اشیاء را میسازه!
اینطوری اگه کلاس Engine تغییر کنه یا اگه بخواهید کلاس   JetEngine  که کلاس Engine را extend کرده رو به جای Engine استفاده کنید لازم نیست کد نوشته شده در کلاس هاتون رو تغییر بدید.
یه نکته بسیار مهم اینه که در Spring تاکید بر programing for interface هست یعنی همه چیز باید interface باشه مثلا به جای implementation کلاس Engine شما از Interface کلاستون در reference دادن استفاده میکنید تا تغییر implementation ها ممکن باشه

----------


## alireza19330

ممنون از همه دوستان، همونطور که اشاره کردید منابع اسپرینگ زیاد هست و من هم تا حدودی مطالعاتی داشتم و خواستم که اطلاعاتم از مفاهیم اسپرینگ کامل تر و درست تر بشه و بعد به سراغ کد زدن برم. ممنون از همه

----------


## gh.abdoli

> ممنون از همه دوستان، همونطور که اشاره کردید منابع اسپرینگ زیاد هست و من هم تا حدودی مطالعاتی داشتم و خواستم که اطلاعاتم از مفاهیم اسپرینگ کامل تر و درست تر بشه و بعد به سراغ کد زدن برم. ممنون از همه


اقا دمتون گرم
خواهش می کنم ادامه بدین خیلی منتظر این مطلب بودم.
با تشکر از همه دوستان

----------

