في الآونة الأخيرة ، اشتريت هذا الكتاب التمهيدي في الربيع: SpringinAction. لقد تصفحت تقريبًا وشعرت بحالة جيدة. مجرد القليل من البدء. كتب مانينغ لا تزال جيدة. على الرغم من أنني لا أركز على مانينغ مثل أولئك الذين قرأوا كتب مانينغ فقط ، إلا أنني قرأتها من خلال الخشوع والعاطفة. مرة أخرى ، قبلت المفاهيم الأساسية للربيع مثل IOC و DI و AOP. اسمحوا لي أن أتحدث عن رأيي في IOC و DI أولاً.
IOC (DI): في الواقع ، فإن مفهوم بنية الربيع الأساسية ليس معقدًا ، وليس غامضًا كما هو موضح في بعض الكتب. يعرف جميع مبرمجي Java أن كل منطق عمل في برنامج Java يتطلب كائنين أو أكثر على الأقل للتعاون. بشكل عام ، عندما يستخدم كل كائن كائن شريكه ، يجب أن يستخدم بناء جملة مثل NewObject () لإكمال عمل تطبيق الكائن الشريك. ستجد أن الاقتران بين الكائنات مرتفع. فكرة IOC هي: حاويات الربيع لتحقيق إنشاء وتنسيق هذه الأشياء المترابطة. الأشياء تحتاج فقط إلى وجود منطق أعمال العلاقة نفسه. في هذا الصدد ، يتم عكس المسؤولية عن كيفية حصول الكائن على كائنه التعاوني (IOC ، DI).
هذه هي تجربتي في الربيع IOC. DI هو في الواقع طريقة أخرى لقول IOC. تم اقتراح DI لأول مرة من قبل مارتن فاولر في ورقة في أوائل عام 2004. وخلص إلى: ما هو العكس؟ وهذا هو: يتم عكس طريقة الحصول على كائنات تابعة.
إذا كنت لا تفهم هذا المفهوم الأساسي بعد: هنا نقتبس من إجابة بسيطة وسهلة الفهم موجودة على مدونة تسمى Bromon:
IOC و DI
أولاً ، أريد أن أتحدث عن IOC (انقلابكونترول ، انعكاس التحكم). هذا هو جوهر الربيع ، طوال الوقت. بالنسبة لإطار الربيع ، يكون الربيع مسؤولاً عن التحكم في دورة حياة الكائن والعلاقة بين الكائنات. ماذا يعني هذا؟ لإعطاء مثال بسيط ، كيف نجد صديقة؟ من الموقف الشائع أن نذهب في كل مكان لنرى أين لدينا نساء جميلات ومظهر جيد ، ثم الاستفسار عن اهتماماتهن وأرقام QQ وأرقام الهواتف وأرقام IP وأرقام IQ ... وإيجاد طرق للتعرف عليهم ، ومنحهم ما يحلو لهم ، ثم هههه ... هذه العملية معقدة وعميقة ، ويجب أن نرتبط ومواجهة كل شيء. وينطبق الشيء نفسه على تطوير البرنامج التقليدي. في كائن ، إذا كنت ترغب في استخدام كائن آخر ، فيجب عليك الحصول عليه (جديد بنفسك ، أو الاستعلام عن واحد من JNDI). بعد الاستخدام ، يجب تدمير الكائن (مثل الاتصال ، وما إلى ذلك) ، وسيتم دمج الكائن دائمًا مع واجهات أو فئات أخرى.
فكيف تفعل IOC ذلك؟ إنه يشبه إلى حد ما العثور على صديقة من خلال وكالة زواج ، وتقديم طرف ثالث بيني وبين صديقتي: وكالة زواج. تدير وكالة الزواج الكثير من المعلومات حول الرجال والنساء. يمكنني تقديم قائمة لوكالة الزواج وأخبرها عن نوع صديقته التي أريد أن أجدها ، مثل تبدو مثل ميشيل ريس ، ولديها شخصية مثل لين شيلي ، والغناء مثل جاي تشو ، والسرعة مثل كارلوس ، والحصول على تقنية مثل زيدان. ثم ستقدم وكالة الزواج MM وفقًا لمتطلباتنا. نحن فقط بحاجة إلى الوقوع في الحب والزواج. إنه بسيط وواضح. إذا لم يستوفي المرشحون المقدمون لنا المتطلبات ، فسوف نرمي استثناء. لم تعد العملية برمتها خاضعة للسيطرة عليها ، ولكن يتم التحكم فيها من قبل مؤسسة تشبه الحاويات مثل وكالة الزواج. هذه هي طريقة التطوير التي دعا إليها الربيع. سيتم تسجيل جميع الفصول في حاوية الربيع لإخبار الربيع بما أنت عليه وما تحتاجه. ثم يمنحك Spring ما تريده عندما يعمل النظام إلى المستوى المناسب ، وفي الوقت نفسه ، يقوم بتسليمك إلى أشياء أخرى تحتاج إلى. يتم إنشاء جميع الفئات وتدميرها بحلول الربيع ، مما يعني أن الكائن الذي يتحكم في دورة حياة الكائن لم يعد هو الكائن الذي يشير إليه ، ولكن الربيع. بالنسبة لكائن معين ، يتم استخدامه للتحكم في الكائنات الأخرى ، ولكن الآن يتم التحكم في جميع الكائنات في الربيع ، لذلك يسمى هذا الانعكاس التحكم.
تتمثل إحدى النقاط الرئيسية في IOC في تزويد كائن ديناميكي بكائنات أخرى يحتاجها أثناء تشغيل النظام. يتم تحقيق ذلك من خلال DI (DependencyInjection). على سبيل المثال ، يحتاج الكائن A إلى تشغيل قاعدة البيانات. في الماضي ، كتبنا دائمًا الكود في A للحصول على كائن اتصال. مع الربيع ، نحتاج فقط إلى معرفة الربيع أن هناك حاجة إلى اتصال في A. فيما يتعلق بكيفية بناء هذا الاتصال ومتى يتم بنائه ، لا تحتاج إلى معرفة. عند تشغيل النظام ، سيقوم Spring بإنشاء اتصال في الوقت المناسب ، ثم حقنه في حقن مثل ، وبالتالي إكمال التحكم في العلاقة بين كل كائن. هناك حاجة إلى الاعتماد على الاتصال إلى التشغيل بشكل طبيعي ، ويتم حقن هذا الاتصال في الربيع بحلول الربيع ، ويأتي اسم حقن التبعية من هذا. فكيف يتم تنفيذ DI؟ ميزة مهمة بعد Java 1.3 هي الانعكاس ، والتي تسمح للبرنامج بإنشاء كائنات ديناميكيًا وتنفيذ طرق الكائنات وتغيير خصائص الكائنات عند التشغيل. يتم حقن الربيع من خلال التفكير. للحصول على معلومات ذات صلة حول التفكير ، يرجى الرجوع إلى Javadoc.
بعد فهم مفاهيم IOC و DI ، سيصبح كل شيء بسيطًا وواضحًا ، وبقية العمل هو مجرد تكديس الكتل في إطار الربيع.
دعونا نتعلم كيف يعمل الربيع.
Public Static Void Main (String [] args) {ApplicationContext Context = new FileSystemXMLAPPlicationContext ("ApplicationContext.xml") ؛ Animal Animal = (Animal) Context.getBean ("Animal") ؛ Animal.Say () ؛ }يجب أن تكون على دراية بهذا الرمز ، ولكن دعنا نحلله. أولاً ، ApplicationContext.xml
<bean id = "animal"> <property name = "name" value = "kitty" /> </bean>
لديه فئة phz.springframework.test.cat
تنفذ CLASS CAT العام {اسم السلسلة الخاصة ؛ public void says () {system.out.println ("i am" + name + "!) ؛} public void setName (اسم السلسلة) {this.name = name ؛}}نفذت واجهة phz.springframework.test.animal
الواجهة العامة Animal {public void says () ؛ }من الواضح أن الكود أعلاه يخرج Iamkitty!
فكيف يفعل الربيع ذلك؟
بعد ذلك ، دعنا نكتب ربيعًا لنرى كيف يعمل الربيع!
أولاً ، نحدد فئة الفاصوليا ، والتي تستخدم لتخزين الخصائص التي تملكها حبة
/ * معرف الفول */ معرف السلسلة الخاص ؛ / * فئة الفول */ نوع السلسلة الخاصة ؛ / * property property */ private Map <String ، Object> properties = new HashMap <string ، Object> () ؛
يتضمن الفول معرف ونوع وخصائص.
يبدأ الربيع المقبل في تحميل ملف التكوين الخاص بنا ويحفظ معلومات التكوين في hashmap. مفتاح Hashmap هو معرف الفول وقيمة HasMap هي الفول. بهذه الطريقة فقط يمكننا الحصول على فئة الحيوان من خلال طريقة السياق. getBean ("Animal"). نعلم جميعًا أن SPIRNG يمكنه حقن الأنواع الأساسية ، ويمكنها حقن أنواع مثل القائمة والخريطة. بعد ذلك ، لنأخذ الخريطة كمثال لنرى كيف يتم حفظ الربيع
يمكن أن يكون تكوين الخريطة مثل ما يلي
<bean id = "test"> <property name = "testmap"> <map> <intply key = "a"> <value> 1 </value> </rethor> <interpl exply = "b"> 2 </value> </entr
كيف ينقذ الربيع التكوين أعلاه؟ الرمز كما يلي:
if (BeanProperty.Element ("map")! = null) {map <string ، object> propertiesMap = new hashmap <string ، object> () ؛ Element PropertiesListMap = (element) BeanProperty.Elements (). get (0) ؛ iterator <؟> propertiesiterator = propertiesListMap.Elements (). iterator () ؛ بينما (propertiesiterator.hasnext ()) {element Vet = (element) propertiesiterator.next () ؛ if (vet.getName (). يساوي ("الإدخال")) {string key = vet.attributeValue ("key") ؛ iterator <؟> valuesiterator = Vet.Elements (). iterator () ؛ بينما (dateiTerator.hasNext ()) {element value = (element) dateiTerator.next () ؛ if (value.getName (). equals ("value")) {propertiesMap.put (key ، value.getText ()) ؛ } if (value.getName (). equals ("Ref")) {propertiesMap.put (المفتاح ، سلسلة جديدة [] {value.attributeValue ("bean")}) ؛ }}}} bean.getProperties (). put (name ، propertiesMap) ؛ }بعد ذلك ، دعنا نذهب إلى الجزء الأساسي. دعونا نرى كيف الربيع هو حقن التبعية. في الواقع ، فكرة حقن التبعية بسيطة للغاية. يتم تنفيذها من خلال آلية الانعكاس. عند إنشاء فئة ما ، يقوم بحقاء سمات الفصل المخزنة في hashmap في الفصل من خلال عكس طريقة المجموعة في الفصل. دعونا نرى كيف يتم ذلك.
أولى إنشاء فصل ، مثل هذا
كائن ثابت عام newInstance (سلسلة classname) {class <؟> cls = null ؛ object obj = null ؛ try {cls = class.forname (className) ؛ obj = cls.newinstance () ؛ (alfictalAccessException e) {رمي new RunTimeException (e) ؛} return obj ؛}ثم يضخ تبعيات هذه الفئة فيه ، مثل هذا
setTerty public static void (Object OBJ ، اسم السلسلة ، قيمة السلسلة) {class <؟ يمتد كائن> clazz = obj.getClass () ؛ حاول {سلسلة methodName = returnsetMthodName (name) ؛ method [] ms = clazz.getMethods () ؛ for (meth m: ms) {if (m.getName (). m.getParameterTypes () [0] ؛ setFieldValue (clazzparametertype.getName () ، القيمة ، m ، obj) RunTimeException (e) ؛}}أخيرًا ، يعيد مثيلًا لهذه الفئة إلينا ويمكننا استخدامه. لنأخذ الخريطة كمثال لنرى كيف يتم ذلك. الكود الذي كتبته هو إنشاء hashmap وحقن hashmap في الفصل الذي يجب حقنه ، مثل هذا
if (value extryof map) {iterator <؟> entryIterator = ((map <؟ ،؟>) value) .entrySet (). iterator () ؛ خريطة <string ، object> map = new hashmap <string ، Object> () ؛ بينما (EntpliTerator.hasNext ()) {entry <؟ if (Entplmap.getValue () estructionof string []) {map.put ((string) entryMap.getKey () ، getBean (((string []) internmap.getValue ()) [0])) ؛ }} BeanProcesser.setProperty (OBJ ، Property ، MAP) ؛ }حسنًا ، حتى نتمكن من استخدام الربيع لإنشاء الفصل لنا. أليس من الصعب؟ بالطبع الربيع يمكن أن يفعل أكثر من هذا. يوفر برنامج المثال هذا جزءًا فقط من وظيفة حقن التبعية الأساسية في Spring.
أشارت هذه المقالة إلى عدد كبير من المقالات ولا يمكن أن تشكر لك واحدًا تلو الآخر. شكرا لك هنا معا. أعتذر عن انتهاك حقوق الطبع والنشر الخاصة بك. آمل أن يكون ذلك مفيدًا للجميع!
لخص
ما ورد أعلاه هو كل محتوى هذه المقالة حول التفسير التفصيلي لمبادئ الربيع IOC ، وآمل أن يكون مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى هذا الموقع:
فهم موجز لأمثلة IOC و AOP و AOP و CODE
مقدمة مفصلة لتنفيذ محاكاة IOC في الربيع
إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!