PDA

View Full Version : سوال: how to creat project Spring with IoC pattern



pro_mvb
سه شنبه 14 شهریور 1391, 13:13 عصر
سلام
متاسفانه تاپیکی در رابطه با spring که توضیح داده باشه وجود نداره(مدیران اجازه ندادن) منم مجبور شدم برای سوالم این تاپیک رو بزنم.
---------
در واقع مشکل من اینه که خود کار با IoC رو متوجه شدم اما اینکه با Spring ازش استفاده کنیم یم مقدار گیجم میکنه! البته به نظر تفاوت چندانی نداره ولی ازاونجایی که تازه دارم باهاش آشنا میشم یه مقدار گیج می زنم:گیج:

تا اینجایی که من از IoC فهمیدم اینه:

در واقع زمانی ازش استفاده میکنیم که ما میخواهیم یک کلاس را در بسیاری از جاها ازش استفاده کنیم به فرض ما برای چاپ کردن یک متن در هرکجای برنامه کلاسی در نظر گرفته ایم که بسته به نوعی که ما میخواهیم (در فایل چاپ کنه یا در سرور قضیه همون خواندن فایل config هست) به جای اینکه مسقتیم از کلاس آبجکت بسازیم و و هر جایی که میخواستیم چییزی را چاپ کنیم با آبجکت ساختن مستقیم (new کردن) ععمل چاپ رو انجام بدیم میایم جاش فقط یه متغیر از نوع اینترفیس یا خود کلاس چاپ کننه تعریف میکنیم( Class or interface a; ) و یک متد setter ایجاد میکنیم که از طریقش بتونیم A رو مقدار دهی بکنیم. حالا اینجاست که در کلاس main باید از کلاس چاپ کننده آبجکت (بدون new کردن) بسازیم و مقدار آبجکت رو از طریق صدا کردن متد setter پاس بدیم به کلاس ها.

اگه با مثال ساده و توضیح جلو برین ممنون میشم. :قلب:
ممنون

pro_mvb
چهارشنبه 15 شهریور 1391, 11:43 صبح
ای بابا کسی نیست پاسخ بده؟ یعنی توو 1 روزه گذشته کسی به تاپیک سر نزده؟

javaphantom
چهارشنبه 15 شهریور 1391, 13:20 عصر
سلام
متاسفانه تاپیکی در رابطه با spring که توضیح داده باشه وجود نداره(مدیران اجازه ندادن) منم مجبور شدم برای سوالم این تاپیک رو بزنم.
---------
در واقع مشکل من اینه که خود کار با IoC رو متوجه شدم اما اینکه با Spring ازش استفاده کنیم یم مقدار گیجم میکنه! البته به نظر تفاوت چندانی نداره ولی ازاونجایی که تازه دارم باهاش آشنا میشم یه مقدار گیج می زنم:گیج:

تا اینجایی که من از IoC فهمیدم اینه:

در واقع زمانی ازش استفاده میکنیم که ما میخواهیم یک کلاس را در بسیاری از جاها ازش استفاده کنیم به فرض ما برای چاپ کردن یک متن در هرکجای برنامه کلاسی در نظر گرفته ایم که بسته به نوعی که ما میخواهیم (در فایل چاپ کنه یا در سرور قضیه همون خواندن فایل config هست) به جای اینکه مسقتیم از کلاس آبجکت بسازیم و و هر جایی که میخواستیم چییزی را چاپ کنیم با آبجکت ساختن مستقیم (new کردن) ععمل چاپ رو انجام بدیم میایم جاش فقط یه متغیر از نوع اینترفیس یا خود کلاس چاپ کننه تعریف میکنیم( Class or interface a; ) و یک متد setter ایجاد میکنیم که از طریقش بتونیم A رو مقدار دهی بکنیم. حالا اینجاست که در کلاس main باید از کلاس چاپ کننده آبجکت (بدون new کردن) بسازیم و مقدار آبجکت رو از طریق صدا کردن متد setter پاس بدیم به کلاس ها.

اگه با مثال ساده و توضیح جلو برین ممنون میشم. :قلب:
ممنون


داستان اینکه new کردن بصورت مستقیم یعنی توی کد از کلمه new استفاده کردن بسیار خطرناکه. چون مدیریت این کار بسیار حساسه. خوب قدیم توی C++ وقتی new می کردی یک متدود ی destructor ی هم بود که باید صدا می کردی تا حافظه آزاد بکنه. بعد اومدن گفتن بیام کار رو راحتر کنیم و داستان garbage collection رو مطرح کردن که آقا تو کاریت نباشه من خودم برای آزاد کردن حافظه خودم هوا تو دارم. اما همچنان گرفتن حافظه با خود developer بود. گرفتن حافظه در یک کامپیوتر شخصی شاید خیلی زیاد مهم نباشه. اما در قسمت سرور که مراجعه کنندگان بسیار زیاد هستن، گرفتن حافظه شوخی نیست دیگه. از این رو هست که کلا new کردن مستقیم یک سری داستانهای مربوط به خودش رو داره.

علاوه بر حافظه، new کردن مستقیم در قسمت طراحی یک پروزه باعث می شه که تغییرات رو خیلی سخت کنه. یعنی باعث می شه Object ها بهم خیلی وابسته بشن و یک حالت چسبندگی صورت بگیره. بطوریکه اگر بخوای یک کلاسی رو که در یک کلاس دیگه ازش new کردی تغییر بدی چون ممکن هست این اتفاق بصورت مسلسل بار در دیگر کلاس ها اتفاق افتاده باشه کار خیلی سخت می شه و ممکن هست تغییر کد زیادی داشته باشی چون وابستگی خیلی زیاده.

خوب من فکر کنم با این دو مطلبی که گفتم قانع شدی باشی که new کردن مستقیم خوب نیست.

راه حل چیه؟ مستقیم نباشه بس باید غیر مستقیم باشه دیگه. اما چه جوری.

من چی کار کنم که بتونم بدون اینکه مستقیم new کنم یک ارتباط رو بین دو یا چند object رو بر قرار کنم.؟ بطوریکه مجبور نشم که دست تو کد ببرم تا مجبور بشم دوباره کامپایل کنم.


pattern ی هست به نام Inversion Of Control که دقیقا این نیاز ما رو پوشش می ده و با مکانیزمه Hollywood Principle کار می کنه. یعنی چی؟

در یکی از ممالک کفر و در سمت غرب وحشی شهر ی هست به نام Los Angeles که در این شهر صنعت فیلم سازی بسیار بسیار رونق داره. از این رو خیلی ها دلشون می خواد برن هنرپیشه بشن و وارد این حرفه یعنی بازیگری. تقاضا زیاده و اینکه بخوان به تک تک این تقاضاها دونه به دونه رسیدگی بشه امکان پذیر نیست. برای حل این مشکل گفتن که شما رزومه بدین، تو رزومتون شماره تلفن بزارین ما خواستیم زنگ می زنیم.

ربطش چیه؟

آگر هنرپیشه ها رو Object ها در نظر بگیرم، انتخاب هنرپشه ها بر اساس نیاز رو می تونیم همون new کردن در نظر بگیریم. انباشه شدن حجمی از تقاضا ها روهم context تعریف می کنیم.


برای روشن تر شدن موضوع از مملکت و شهر کفر بیرون می یام و بر می گردم به اصل قضیه.

در قمست طراحی بحثی هست به نام loose coupling and high cohesion

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

راحتر develop کنیم
راحتر پشتیبانی کنیم
راحتر بهینه کنیم

به این مثال نگاه کنید


public class MyCar {

private PayKanEngine payKanEngine; // Problem 1: References to concrete class

public MyCar() {
payKanEngine = new PaykanEngine(); // Problem 2: Direct instancing from concrete class
}


}


به مشکلات نگاه کنید. مستقیم یک متغییر از یک کلاس معمولی. اگر بخواهیم تغییر بدیم مثل موتور پیکان بشه بنز باید کلی تغییر ایجاد بشه. یعنی متغییر پیکان همه جا باید بشه بنز

بدتر از اون مستقیم new کردیم یعنی اینکه بدتر از بدتر نا خواسته کلی وابستگی ایجاد شده.. بس اگر فردا من بخوام بنز داشته باشم جای پیکان برم از اول کد بزنم سنگینر تا بخوام تغییر بدم


راه حل :

هرچی موتور حاضر آماده دارم بزارم توی یک انبار یا همون context بعد بجایی اینکه خودم بیام مستقیم new کنم بگم بک نفر دیگه که بره این کار رو انجام بده. من اسم بدم اون خودش اون پشت تغییر بده

چه جوری؟ IoC. یعنی چی باز؟


public class MyCar {

private Engine engine; // Engine is an interface and it is not a concrete class

public MyCar() {
}
|----------step 2: passes the object to the MyCar Class-----|
|
\/ |
public void setEngine(Engine engine) { |
this.engine = engine; |
} |
|
} |
----------|
| |
public class PeyKanEngine implements Engine { | |
| |
public PeyKanEngine() { | IoC |
System.out.println("peykan Engine"); <-----------Step 1: Creates Peykan Object---- |
| |
} | |
|---------

}

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

می بینی که یکEngine interface هست با پیاده سازی های مختلف مثلا بنز یا BMV یا هرچی و من توی کلاسی که می خوام از یک موتور خواصی استفاده کنم نمی رم مستقیم سراغ اون متور بلکه از interface موتور استفاده می کنمو از طریق اون IOC می یام implenetation موتور رو انتخاب می کنم و می گم اون برام new کنه و بزارت توی کلاس ماشینم از طریق یک setter method


برای شروع فکر کنم خوب باشه

pro_mvb
چهارشنبه 15 شهریور 1391, 21:56 عصر
خیلی خیلیییییییی ممنون ، خیلی وقت گذاشتین براش پاسخ دهیش! اما:
اینجا درسته کلاس IoC میاد کلاس پیکان رو new میکنه (البته نه به صورت مستقیم یعنی از کلمه new استفاده نمیکنه و با استفاده از یک متد که میتونه داخل کلاس peykan باشه و آبجکت از خود کلاس رو reutrn کنه استفاده میکنه)
حالا میشه همچین کاری کرد؟:
من بیام اول متد setter رو به صورت static تعریف کنم . بعد در کلاس IoC هم خط اول مقدار آبجکت پیکان رو بگیرم سپس در خط بعدش مقدار رو از طریق فراخوانی متد static کلاس MyCar پاس بدم به کلاس MyCar و اونجا از آبجکت استفاده بشه.
تا اینجاش اگه درسته فقط یه درسته بگین تا من بخش های بعدی سوالمو بپرسم.(چون خیلی مهم هستن)
برای وقتی که بابت این دانشجوی کم سواد میذارین کمال تشکر رو دارم.

javaphantom
پنج شنبه 16 شهریور 1391, 10:05 صبح
خیلی خیلیییییییی ممنون ، خیلی وقت گذاشتین براش پاسخ دهیش! اما:
اینجا درسته کلاس IoC میاد کلاس پیکان رو new میکنه (البته نه به صورت مستقیم یعنی از کلمه new استفاده نمیکنه و با استفاده از یک متد که میتونه داخل کلاس peykan باشه و آبجکت از خود کلاس رو reutrn کنه استفاده میکنه)
حالا میشه همچین کاری کرد؟:
من بیام اول متد setter رو به صورت static تعریف کنم . بعد در کلاس IoC هم خط اول مقدار آبجکت پیکان رو بگیرم سپس در خط بعدش مقدار رو از طریق فراخوانی متد static کلاس MyCar پاس بدم به کلاس MyCar و اونجا از آبجکت استفاده بشه.
تا اینجاش اگه درسته فقط یه درسته بگین تا من بخش های بعدی سوالمو بپرسم.(چون خیلی مهم هستن)
برای وقتی که بابت این دانشجوی کم سواد میذارین کمال تشکر رو دارم.


IoC کلاس نیست یک روش یا یک pattern هست. فریم ورکهایی هستند که این pattern رو پیاده سازی کردن و ما توی برنامه هامون ازشون استفاده می کنیم. معروف های اونها

Spring
Seam
EJB

pro_mvb
پنج شنبه 16 شهریور 1391, 11:46 صبح
بله میدونستم منظور من از کلاس IoC همون کلاس میانی میباشد که کار ساختن آبجکت رو به عهده دارد. من اسم کلاس رو IoC در نظر گرفتم. حالا ااون چیزی که بالا تعریف کردم درسته؟ من دیشب بیشتر که فکر کردم به این نتیجه رسیدم که اینکار فقط برای یک کلاس انجام میشه (یعنی پیکان) و اگر قرار باشه از کلاس های دیگه مثلBMW استفاده بشه امکان پذیر نمیشه !

pro_mvb
پنج شنبه 16 شهریور 1391, 12:36 عصر
در واقع من ینجوری فکر می کنم که مثلا یک کلاسی به نام CreatEngine وجود داره که درونش به این شکل هست:

public class CreatEngine{

Engine engine;
public static Engine getEngine(){
(اینجا از طریق فایل میاد میبینی که ما از چه کلاسی میخواهیم آبجکت بسازیم)
engine=(Engine) Class.froName("متغیر مربوط بع خواندن کلاس").newInstance
return engine;
}



حالا اینجاهم که کلاس MyCar طبق همون پیاده سازی خودتون ساخته میشه!:

public class MyCar{
Engine engine;
public void settEngine(Engine engine){
this.engine=engine;
}


اینجا هم کلاس CreatCar هست که در اینجا اول از طریق کلاس CreatEngine مشخص میکنیم که از چه کلاسی (پیکان ، بی ام دبلیو، بنز) ما آبجکت یا همون engine میخوایم که به این شکل:


public class CreatCar{
CreatEnigine engine= CreatEngine.getEngine();
MyCar car=new MyCar();
car.settEngine(engine);
}


خوب این شد IoC بدون استفاده از Spring.
فقط منونده تاییدیه شما:D که ایشالا بعدش بریم پیاده سازیش از طریق Spring.

javaphantom
پنج شنبه 16 شهریور 1391, 16:53 عصر
می شه گفت تا حدودی درست فهمیدید. اما اگر در مثال من دقت کرده بودید من در مورد CONTEXT صحبت کردم و رنگش رو قرمز.

پس ما باید یک مخزنی داشته باشیم که کلاس ها رو اونجا معرفی کنیم.


مثال : فرض کنیم می خواهیم خودمون بیایم IoC pattern رو پیاده سازی کنیم.

مواد لازم : یک فایل properties که داخل این فایل ما باید به این صورت عمل کنیم


key=value

در قسمت key ما نام Object رو در نظر می گیریم و در قسمت value کلاس رو با همراه package معرفی می کنیم.

پس ما یک جایی یا یک contextی هست که می تونه برامون object ها رو نگه داره.

پس من یک فایل دارم به نام myContext.properties که اومدم توی این فایل معرفی کردم دو تا موتو ماشین رون یکی بنز و دیگر بی ام و



benz=com.me.BenzEngine
bmw=com.me.BMWEngine


حالا نیاز به یک context manager دارم تا بتونم context رو که توش کلاس ها معرفی شده رو مدیریت کنم اینم کلاس MyContextManager



public class MyContextManager {


private ResourceBundle bundle = ResourceBundle.getBundle("myContext");


private Map<String,Object> myEngineMap = new HashMap<String, Object>();

public MyContextManager() {


try {
for (String engineName:bundle.keySet()) {
Object engineInstance = Class.forName(bundle.getString(engineName)).newIns tance();
myEngineMap.put(engineName,engineInstance);
}
} catch (InstantiationException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (IllegalAccessException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (ClassNotFoundException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}

}

/**
*
* @param engineName
* @return
*/
public Object getMyEngineByName(String engineName) {

return this.myEngineMap.get(engineName);
}

}



به MyContextManager دفت کنید. وقتی ازاین کلاس new می کنیم یا به عبارتی context رو بالا می یاریم. می ره توی فایل properties اونو با ز می کنه و شروع می کنه از کلاسی که گفتیم با نامی که بهش دادیم یکی یکی instance می گیره و داخل یک map می زاره که کلید map نام کلاس instance گرفته شده است که خودمون تون myContext.properties قرار دادیم و مقدار آن instance object ما هست.

حالا ما خیلی راحت با داشتن این CONTEXT راحت می تونیم به کلاسهایی که می خواهیم دسترسی داشته باشیم. اما چه جوری

بر می گردم به مثال اول یک موتور داریم کاملا انتزاعی



public interface Engine {


String getEngineType() ;
}



دونوع implementation جدا با نام بنز و بی ام و



public class BMWEngine implements Engine{
@Override
public String getEngineType() {
return "BMW";
}
}




public class BenzEngine implements Engine{
@Override
public String getEngineType() {
return "Benz";
}
}


و حالا نوبت ساختن ماشین خودم هست که راحت بیام استفاده کنم



public class MyCar {

private Engine engine; //مستقیم نگفتم که کدوم موتور

public MyCar() {

}

public void setEngine(Engine engine) {
this.engine = engine;
}

public String getMyCarEngineType() {
return this.engine.getEngineType();
}


public static void main(String[] s) throws Exception {
MyContextManager myContextManager = new MyContextManager();
MyCar myCar = new MyCar();
myCar.setEngine((Engine)myContextManager.getMyEngi neByName("benz"));
System.out.println("myCar. = " + myCar.getMyCarEngineType());
}
}



دقت کنید در کلاس MyCar هیچ new وجود ندارد.

فقط یک setter هست که این اجزا رو می ده تا از بیرون بتونی یک کلاس implement شده از Engine رو بهش باس یا inject کنی

در static void main اگر دقت کنید می بینی اول context رو آوردم بالا بعد رفتم از کلاس ماشین new کردم بعد از طریق setter گفتم کدوم implentation رو برو از contxt در بیار و inject کن.

حالا اگر بخواهیم بجای بنز، بی ام و داشته باشیم بدون اینکه در کلاس MyCar دست به چیزی بزنیم کافیس از بیرون از طریق setter کلاس بی ام و رو inject کنیم. به جال کلمه benz بگیم bmw برامون از context در بیار و inject کن

pro_mvb
پنج شنبه 16 شهریور 1391, 19:36 عصر
خوب بود ولی زیادی خوب بود راستش یه خورده برای من اولش پیچیده شد. مخصوصا کلاس Mycontext که اصلا ایجاد رعب و وحشت کرد. یک خورده پیچیده شد در واقع من فکرم این بود که به جای این که از bmw و بنز و پیکان در map آبجکت بسازیم و بریزیمشون اونتو. با یه if else ساده تعیین میکنم که کاربر چه نوع موتوری میخواد. که در واقع با load کردن فایل properties و ،key=object از طریق برنامه متوحه میشم که کاربر چه نوع موتوریو میخواد اگ مثلا radiobuton1 بود آبجکت بی ام دبلیو اگه radiobuton2 بود آبجکت بنز و..
ضایعست این کار؟

javaphantom
جمعه 17 شهریور 1391, 13:24 عصر
مثالی که من زدم حالت خیلی ساده برای پیاده سازی IoC بود. فریم ورکهای spring ,EJB,Seam همشون به یک نحوی یک context دارند و یک context manager و هر کدوم به یک روشی این کلاس ها رو به این context معرفی می کنن معمولا از طریق annotation یا از طریق xml یا هر دو. ولی نهایت اینکه باید از طریق یک context manager بتونن context را load کنند و بتونن inject یا lookup بکنند object ها رو.

چیزی که من مثلا زدم به عبارتی بچه باز بود. من فقط می خواستم چند نکته مهم رون تو مثال بگم.

context
context manager
interface and abstraction
همین. حالا هر جور که دوست داری برو پیاده سازی کن

pro_mvb
جمعه 17 شهریور 1391, 20:41 عصر
دقیقا اون چیزیم که من میگم همون contexte الان بیشتر توجه کردم دیدم همونه در واقع راستش من اینکه آبجکت هارو بریزم توی Hashmap بلد نیستم از اون یه مقدار گیج شدم. وگرنه کتاب هم context رو درست کرده ولی اسمشو نگفته context
خوب حالا بد از این میشه پیاده سازیشو با Spring توضیح بدین به نظر من Spring ساده تر کرده فقط اونجایی که در xml میگیم ref local="name" رو دقیق نمیفهمم!
ممنون

pro_mvb
شنبه 18 شهریور 1391, 22:11 عصر
بی صبرانه منتظر ادامه موضوع هستم

javaphantom
شنبه 18 شهریور 1391, 22:51 عصر
بی صبرانه منتظر ادامه موضوع هستم

حالا همون مثال با SPRING

اول myContext.properties که شده myContext.xml

نکته : Spring دارای expression language بسیار قوی هست و یک api جدا برای این کار داره. در قسمت تنظیمات context از طریق xml ی که هست یک پارسر داره که مقادیر رو می تونی تعریف کنی. پس اینجا بجای اون properties فایل xml می نویسیم



<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


<bean id="benz" class="com.me.BenzEngine"/>

<bean id="bmv" class="com.me.BMVEngine"/>

<bean id="myCar" class="com.me.MyCar">
<property name="engine" ref="benz"/>
</bean>

</beans>


از سه کلاس همراه با آدرس کامل در پروژه (package) هر کدام یک نام هم گرفته اند به context معرفی می کنیم

در تعریف کلاس myCar که بعدا کد رو می بینی یک property دارد که از نوع Engine می باشد. دو کلاس با لا تر هر دون کلاس Engine رو پیاده سازی کردن. در قسمت ref گفته شده که از دو کلاس پیاده سازی شده کدام اشاره بکند. یعنی همان benz



package com.me;

/**
* Created by IntelliJ IDEA.
* User: babak
* Date: 9/9/12
* Time: 6:50 AM
* To change this template use File | Settings | File Templates.
*/
public interface Engine {

/**
*
* @return
*/
String getEngineType();
}





package com.me;

/**
* Created by IntelliJ IDEA.
* User: babak
* Date: 9/9/12
* Time: 6:52 AM
* To change this template use File | Settings | File Templates.
*/
public class BMVEngine implements Engine{

@Override
public String getEngineType() {
return "BMV";
}
}





package com.me;

/**
* Created by IntelliJ IDEA.
* User: babak
* Date: 9/9/12
* Time: 6:51 AM
* To change this template use File | Settings | File Templates.
*/
public class BenzEngine implements Engine {

@Override
public String getEngineType() {
return "Benz";
}
}





package com.me;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlAp plicationContext;

/**
* Created by IntelliJ IDEA.
* User: babak
* Date: 9/9/12
* Time: 6:53 AM
* To change this template use File | Settings | File Templates.
*/
public class MyCar {

private Engine engine;

public void setEngine(Engine engine) {
this.engine = engine;
}

public String getMyCarEngineType() {
return engine.getEngineType();
}


public static void main(String[] s) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/MyContext.xml");

MyCar myCar = (MyCar) applicationContext.getBean("myCar");

String myCarEngineType = myCar.getMyCarEngineType();

System.out.println(myCarEngineType);
}
}



در قسمت اجرای برنامه در متدود static void main اول context manager یا همان ApplicationContext رو بالا می آوریم و می گیم که بره کدوم تنظیمات رو بخونه. بعد از طریق متدود getBean می گیم که بره کدوم object که اسمشو دادیم رو برامون بیاره. myCar که وقتی می یارتش همراه با موتوری هست که بش گفتتیم برو توی این کلاس inject کن. همون ref.

حالا myCar حاضر و آماده اینجاست. اگر بخوام بجای benz بیام و bmv داشته باشم بدون اینکه برم توی کد دست بزنم، می رم توی xml و ref رو به BMV اشاره می دم

pro_mvb
چهارشنبه 22 شهریور 1391, 14:17 عصر
ایول خوب و ساده و کاملا کارا ! این کتاب همین getBean رو خیلی پیچیدش کرده نمیدونم بازش کرده چیکار کرده که موقع مثال زدن اونجای برنامه که میرسم گیج می زنم.
خوب یه داستان دیگه ای هم داره که در فایل context که xml هست یه property local ref هم وجود داره میشه اونو هم توضیح بدین؟ یه جوایی انگار IoC توو IoC میشه

aloneman2005
پنج شنبه 01 اسفند 1392, 18:27 عصر
ممنون بابت وقت گذاشتنتون.
فرق بین ماژولار کردن OSGI و IOC و Depenency Injection چیه؟
در قسمت بالا شما از spring استفاده کردید
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/MyContext.xml");
چرا باید از کد بالا استفاده بکنم. من که خودم نام کلاس رو میشناسم پس همون رو هم new میکنم .
MyCar myCar=new MyCar();
myCar.SetEngine(new BenzEngine());

کار Spring اینجا چی بوده .
ممنون.