التحضير لشهادة الربيع المهنية. الحاوية ، IoC ، الفول

يوم جيد يا هبر.


قررت اليوم أن أقدم لكم ترجمة لسلسلة من المقالات استعدادًا لشهادة Spring Professional .


هذه الترجمة هي المقالة الأولى فقط ، إذا ذهبت إلى الجمهور ، فسأواصل إصدار الترجمات.


لماذا أفعل هذا ، لأن هناك بالفعل مجموعة من المواد المتخصصة؟
  1. غالبًا ما تكون المعلومات الموجودة فيها غير منظمة أو غير مجمعة أو غير ذات صلة
  2. المطورين الشباب قد لا يعرفون اللغة الإنجليزية. يمكن استخدام هذه الدورة ليس فقط للحصول على الشهادات ، ولكن أيضًا للتدريب الذاتي / لتكرار المواد.
  3. هذه المواد يمكن استخدامها في التحضير للمقابلة ، كما يتم ترتيبها في شكل أسئلة وأجوبة.
  4. من أهم وأهم الميزات أن ضمان الجودة هذا يتكون من أسئلة من دليل الدراسة المحورية الرسمي.

  • غاب عن عمد بعض الأسئلة التي بدت لي زائدة أو التي لم تكن في الدليل .

جدول المحتويات
  1. حقن التبعية ، حاوية ، IoC ، والفاصوليا
  2. AOP (البرمجة الموجهة نحو الجوانب)
  3. JDBC ، المعاملات ، JPA ، بيانات الربيع
  4. التمهيد الربيع
  5. ربيع mvc
  6. أمن الربيع
  7. REST
  8. تجريب


سأكتب قائمة بالمصادر التي أخذ منها المؤلف المواد
  • ربيع 5 أنماط التصميم
  • الربيع في العمل الطبعة الرابعة
  • ربيع الأمن - الطبعة الثالثة
  • الأساسية ربيع 5 شهادة في التفاصيل من قبل إيفان كريزان
  • توثيق الربيع و javadocs API الربيع

لذلك ، دعونا نبدأ.


ما هو حقن التبعية (DI) وما هي فوائده؟

حقن التبعية هو نمط خاص يقلل من التواصل بين مكونات Spring. وبالتالي ، عند تطبيق DI ، يصبح الكود أكثر نظافة وبساطة ، يصبح فهمه واختباره أسهل.
وفقًا لنمط DI ، يتم نقل كائنات التبعيات إلى المصنع أو منحها لطرف ثالث. هذا يعني أنه يمكننا التركيز على استخدام هذه الكائنات بدلاً من إنشائها.


فوائد DI
  • انخفاض التواصل بين أجزاء التطبيق
  • تحسين الاختبار
  • تعزيز بنية التطبيق
  • يقلل رمز الغليان
  • يقيس تطوير التطبيق

لماذا ينصح واجهات لإنشاء حبوب الربيع؟
  • تحسين الاختبار. في الاختبارات ، يمكن استبدال الحبة بكائن خاص (وهمي أو كعب رقيق) يقوم بتنفيذ واجهة الحبة.
  • يتيح لك استخدام آلية الوكيل الديناميكية من JDK (على سبيل المثال ، عند إنشاء مستودع عبر Spring Data)
  • يسمح لك بإخفاء التطبيق

ما هو سياق التطبيق؟

في Spring Framework ، توفر الواجهة org.springframework.factory.BeanFactory مصنعًا org.springframework.factory.BeanFactory ، وهو في نفس الوقت حاوية تطبيق IoC. إدارة الحبة تعتمد على التكوين (جافا أو XML).


واجهة org.springframework.context.ApplicationContext عبارة عن غلاف على مصنع للفاصوليا يوفر بعض الميزات الإضافية ، مثل AOP والمعاملات والأمان و i18n وما إلى ذلك.


ما هي الحاوية وما هي دورة حياتها؟

أساس إطار الربيع عبارة عن حاوية ، وكائناتنا "تعيش" في هذه الحاوية.
تقوم الحاوية عادةً بإنشاء العديد من الكائنات استنادًا إلى تكويناتها وتدير دورة حياتها من إنشاء كائن إلى التدمير.


الحاوية هي كائن يقوم بتطبيق واجهة ApplicationContext .


دورة حياة الحاوية
  1. يتم إنشاء الحاوية عند بدء تشغيل التطبيق.
  2. الحاوية يقرأ بيانات التكوين
  3. يتم إنشاء وصف الصناديق من بيانات التكوين
  4. BeanFactoryPostProcessors التعامل مع وصف الفول
  5. الحاوية يخلق الفاصوليا باستخدام وصفهم
  6. تتم تهيئة الفول - يتم تضمين قيم الخصائص والاعتمادات في الحبة
  7. BeanPostProcessor بدء أساليب رد الاتصال
  8. التطبيق قيد التشغيل
  9. تهيئة إغلاق التطبيق
  10. يغلق الحاوية
  11. تسمى أساليب رد الاتصال

كيفية إنشاء مثيل ApplicationContext؟

يوفر الربيع عدة أشكال مختلفة من السياق.


هناك العديد من التطبيقات الأساسية لواجهة ApplicationContext:


  • FileSystemXmlApplicationContext
  • ClassPathXmlApplicationContext
  • AnnotationConfigApplicationContext
  • XmlWebApplicationContext
  • AnnotationConfigWebApplicationContext

أمثلة على إنشاء سياق:


 ApplicationContext ctx = new FileSystemXmlApplicationContext(                                     "c:/bean_properties.xml"); ApplicationContext ctx = new AnnotationConfigApplicationContext(                            "com.springdemoapp.JavaConfig.class"); 

هل يمكنك وصف دورة حياة حبة في حاوية؟
  1. تحميل أوصاف الحاوية ، وإنشاء رسم بياني تبعية (بين الفول)
  2. إنشاء BeanFactoryPostProcessors
  3. خلق الفول
  4. يحقن الربيع القيم والتبعيات في خصائص الحبة
  5. إذا كان الفول يطبق طريقة setBeanName() من واجهة NameBeanAware ، فسيتم تمرير معرف الحبة إلى الطريقة
  6. إذا كانت الحبة تنفذ BeanFactoryAware ، فإن Spring يحدد مرجعًا لمصنع الحبة عبر setBeanFactory() من هذه الواجهة.
  7. إذا كان الفول يطبق واجهة ApplicationContextAware ، فإن Spring يحدد مرجعًا إلى ApplicationContext من خلال setApplicationContext() .
  8. BeanPostProcessor هي واجهة خاصة (حولها أدناه) ، ويسمح Spring لصناديق لتنفيذ هذه الواجهة. من خلال تطبيق طريقة postProcessBeforeInitialization() ، يمكنك تغيير مثيل الحبة قبل تهيئتها (الحبة) (خصائص الضبط ، إلخ)
  9. إذا تم تحديد أساليب رد الاتصال ، فإن Spring يتصل بهم. على سبيل المثال ، هذه طريقة مشروحة بواسطة @PostConstruct أو طريقة initMethod من تعليق توضيحي @Bean .
  10. الفول جاهز الآن للاستخدام. يمكن الحصول عليها باستخدام ApplicationContext#getBean() الأسلوب.
  11. بعد إغلاق سياق ( close() الأسلوب من ApplicationContext) ، يتم إتلاف الحبة.
  12. إذا كانت الحبة تحتوي على طريقة مشروحة بواسطة @PreDestroy ، فسيتم استدعاء هذه الطريقة قبل التدمير. إذا قام الحبة بتنفيذ DisposibleBean ، فستقوم Spring باستدعاء طريقة destroy() لمسح الموارد أو قتل العمليات في التطبيق. إذا تم تعريف طريقة @Bean في destroyMethod ، فسيتم استدعاؤها أيضًا.

كيفية الحصول على ApplicationContext في اختبار التكامل؟

إذا كنت تستخدم JUnit 5 ، فأنت بحاجة إلى تحديد تعليقين توضيحيين:


  • ExtendWith (TestClass.class) - يستخدم للإشارة إلى فئة اختبار
  • ContextConfoguration (classes = JavaConfig.class) - يقوم بتحميل تكوين java / xml لإنشاء سياق في الاختبار

يمكنك استخدام التعليق التوضيحي @SpringJUnitConfig ، والذي يجمع بين كل من هذه التعليقات التوضيحية.
يمكنك استخدام التعليقات التوضيحية @SpringJUnitWebConfig لاختبار طبقة الويب.


كيف تغلق السياق في تطبيق ما؟

إذا لم يكن هذا تطبيق ويب ، فهناك طريقتان:


  • تسجيل إيقاف التشغيل باستخدام استدعاء الأسلوب registerShutdownHook() ، كما يتم تطبيقه في فئة AbstractApplicationContext. هذه هي الطريقة المفضلة.
  • يمكنك استدعاء الأسلوب close() من فئة AbstractApplicationContext.

في تطبيق Spring Boot:


  • سوف Spring Boot تسجيل هوك الإغلاق لك من تلقاء نفسها.

ما هو تكوين جافا؟ كيف يتم تطبيقها؟

لإنشاء فصل بتكوين يستند إلى تعليمة Java البرمجية ، يلزمك التعليق عليها
@Configuration .
سيحتوي هذا الفصل على طرق المصنع لإنشاء الفاصوليا في الحاوية.
يجب أن يتم شرح هذه الطرق مع التعليق التوضيحي @Bean .


مثال:


 @Configuration public class DSConfig {  @Bean  public DataSource dataSource() {      return DataSourceBuilder          .create()          .username("")          .password("")          .url("")          .driverClassName("")          .build();  } } 

سيقوم هذا الفصل بوضع مثيل لفئة مصدر البيانات في الحاوية. في وقت لاحق يمكن استخدامه عند الوصول إلى قاعدة البيانات.


DI باستخدام التعليقات التوضيحية والمسح الضوئي للصف

فحص المكونات - يكتشف Spring تلقائيًا الفاصوليا التي ستكون في الحاوية. هذه هي الصناديق مع الصور التوضيحية.


ومع ذلك ، لا يتم تمكين فحص المكونات بشكل افتراضي.
لتمكين المسح ، قم بتعليق فئة التكوين @ مع التعليقات التوضيحية @ComponentScanning . سيقوم Spring تلقائيًا بفحص الحزمة التي تحتوي على هذه الفئة وجميع حزمها الفرعية.
يمكنك تحديد حزم أخرى للمسح الضوئي ، وحتى الطبقات:


 // 2  @Configuration(basePackages = {"soundsystem", "video"}) 

 //  @Configuration(basePackageClasses = "MyClass.class") 

Autowiring - Spring سيضخ التبعيات تلقائيًا عند مسح حاوية أو وضعها في حاوية.
يستخدم حقن التبعية التعليق التوضيحي @Autowire .


ما هي الصور النمطية (الصور التوضيحية)؟

الصور النمطية هي تعليقات توضيحية تدل على وظائف خاصة.
تشمل جميع الصور النمطية التعليقات التوضيحية @Component .


عنصرالتعليق التوضيحي الجذر الذي يصنف الفصل كمرشح للتنفيذ التلقائي
مراقبيشير إلى أن الفئة هي وحدة التحكم لإرسال البيانات إلى المقدمة.
RestControllerيشير إلى أن الفئة هي جهاز التحكم لـ REST.
يحتوي على تعليقات توضيحية على وحدة التحكم و @ ResponseBody
خدمةيشير إلى أن الفئة هي خدمة لتنفيذ منطق الأعمال.
مستودعيشير إلى أن الفصل عبارة عن مستودع للعمل مع قاعدة البيانات.
Configurationيشير إلى أن الفصل يحتوي على تكوين Java (طرق @ Bean)

ما هي نطاقات بن؟ ما هي رؤيتهم الافتراضية؟

النطاق - النطاق. هناك 2 نطاقات الافتراضية.


الورقة المفردة
النطاق الافتراضي. هناك مثيل واحد فقط في الحاوية
النموذج
يمكن أن يكون أي عدد من مثيلات حاوية في الحاوية

و 4 نطاقات في تطبيق ويب.


طلب
النطاق - طلب HTTP واحد. يتم إنشاء فاصوليا جديدة لكل طلب.
جلسة
النطاق - جلسة واحدة. يتم إنشاء فاصوليا جديدة لكل جلسة.
تطبيق
النطاق - دورة حياة ServletContext
مقبس الويب
النطاق - دورة حياة WebSocket

يشار إلى النطاق باستخدام التعليق التوضيحي @Bean على طرق @Bean .


كيف ترتبط مختلف المجالات و multithreading؟

النموذج الأولي النطاق غير آمن ل لا يضمن أنه سيتم استدعاء المثيل نفسه فقط في 1 موضوع.


Singleton Scope ، من ناحية أخرى ، آمن للخيط.


كيف يتم إنشاء الفاصوليا: على الفور أو كسول؟ كيفية تغيير هذا السلوك؟

عادة ما يتم إنشاء حبوب مفردة فور المسح.
عادة ما يتم إنشاء حبوب النموذج الأولي فقط عند الطلب.


يمكنك استخدام التعليقات التوضيحية @Lazy للإشارة إلى كيفية التهيئة.
يتم وضعه على طرق @ Bean ، أو في فصول التكوين @ أو على فصول المكون @.
اعتمادًا على المعلمة (صواب أو خطأ) التي يقبلها التعليق التوضيحي ، ستكون التهيئة إما كسولًا أو ستحدث على الفور. افتراضيًا (على سبيل المثال ، دون تحديد معلمة) ، يتم استخدام true.


ماذا يحدث إذا تم تضمين حاوية بنطاق واحد في حاوية بنطاق آخر؟

يمكن أن تكون جزءا لا يتجزأ من الفول Singleton في أي حبوب أخرى.


يمكن تضمين prototype أو singleton فقط في singleton .
إذا قمت بتطبيق النموذج الأولي ، فسيتم إنشاء نموذج أولي فريد لكل مفردة.


يمكن أن يكون النموذج الأولي تبعية لأي حبة.
يمكنك فقط تنفيذ المفرد أو النموذج الأولي.


ما هو BeanFactoryPostProcessor ومتى يتم استخدامه؟
  • يعمل BeanFactoryPostProcessor على أوصاف حاوية أو بيانات تعريف التكوين قبل إنشاء الصندوق.
  • يوفر Spring العديد من BeanFactoryPostProcessor المفيدة ، على سبيل المثال ، قراءة ملفات الخصائص والحصول على خصائص BeanFactoryPostProcessor منها.
  • يمكنك كتابة التنفيذ الخاص بك من BFPP.

لماذا تحتاج إلى أسلوب ثابت @ فول؟

من أجل استخدام مخصص BFPP. يمكنك تجاوز آلية الحصول على البيانات من ملفات التعريف.


 @Bean public static PropertySourcesPlaceholderConfigurer pspc() {    //,    pspc } 

صف خصائص الشرحBean
  • destroyMethod - يشير إلى طريقة رد الاتصال. الطريقة في الصندوق.
  • initMethod - يشير إلى طريقة رد الاتصال. الطريقة في الصندوق.
  • name - اسم الحبة. بشكل افتراضي ، اسم الحبة هو اسم الطريقة.
  • value - الاسم المستعار للاسم ()

ما هو BeanPostProcessor وكيف هو مختلف عن BeanFactoryPostProcessor؟

يستخدم الربيع عدة BeanPostProcessors.
على سبيل المثال ، CommonAnnotationPostProcessor أو AutowiredAnnotationBeanPostProcessor .
BPP يعمل مع مثيلات الفاصوليا ، أي الحاوية بإنشاء حاوية ، ثم يبدأ BPP.



ما هي طرق رد الاتصال وكيفية استخدامها؟

هناك 3 خيارات لإنشاء مثل هذه الأساليب:


  • @PreDestroy و @PostConstruct الشروح
  • destroyMethod و destroyMethod في التعليقات التوضيحية destroyMethod التي تشير إلى الأساليب في فئة bean
  • InitializingBean#afterPropertiesSet() و DisposableBean#destroy() InitializingBean#afterPropertiesSet() DisposableBean#destroy() . لتجاوز هذه الأساليب ، تحتاج إلى تطبيق واجهات المقابلة.


كيف يمكنني استخدام التعليقات التوضيحيةAutowire وما الفرق بين الطرق؟

فيما يلي أنواع DI التي يمكن استخدامها في التطبيق الخاص بك:


  • منشئ DI
  • واضعة دي
  • مجال دي

يعتبر DI من خلال المنشئ أفضل طريقة ، لأنه بالنسبة له ليست هناك حاجة لاستخدام التفكير ، وليس لديه عيوب DI من خلال واضعة.
لا ينصح DI من خلال الميدان ، ل لهذا ، يتم استخدام الانعكاس الذي يقلل من الإنتاجية.
من خلال DI منشئ يمكن أن يؤدي إلى تبعيات دائرية . لتجنب ذلك ، يمكنك استخدام التهيئة البطيئة للفاصوليا أو DI من خلال أداة الضبط.


وصف سلوك التعليقات التوضيحية @
  1. تحدد الحاوية نوع الكائن المراد تضمينه.
  2. تبحث الحاوية عن الفول في سياق (ويعرف أيضًا باسم الحاوية) التي تطابق النوع المطلوب
  3. إذا كان هناك العديد من المرشحين ، وتم تمييز @Primary أنه @Primary ، فسيتم تنفيذه
  4. إذا تم استخدام التعليقات التوضيحية @Autowire + Qualifier @Autowire الحاوية المعلومات من @Qualifier لمعرفة أي مكون لنشره
  5. وإلا ، ستحاول الحاوية حقن المكون استنادًا إلى اسمه أو معرفه.
  6. إذا لم تنجح أي من الطرق ، فسيتم طرح استثناء

الحاوية يعالج DI باستخدام AutowiredAnnotationBeanPostProcessor . في هذا الصدد ، لا يمكن استخدام التعليق التوضيحي في أي BeanFactoryPP أو BeanPP.


إذا كان الكائن الذي تم حقنه عبارة عن صفيف أو مجموعة أو خريطة ذات نوع عام ، فسيقوم Spring بتضمين جميع أنواع الحبوب الموجودة في هذه الصفيف (أو بنية بيانات أخرى). في حالة الخريطة ، سيكون المفتاح هو اسم الحبة.


 // ,   DI @Authowired(required = true/false) 

كيفية جعل DI في مجال خاص؟

يمكنك استخدام أنواع مختلفة من التنفيذ:



كيف يمكن استخدامQualifier أن يكمل @ Aututired؟

يوفر Spring شرحًا للتأهل للتغلب على مشكلة غموض DI.


 @Bean @Qualifier("SomeClass1") public SomeClass getField() {...} //… @Autowire @Qualifier("SomeField1") public SomeClass someField; 

إذا كانت الحاوية تحتوي على عدة صناديق من نفس النوع (SomeClass) ، فستنفذ الحاوية تلك الحاوية تمامًا ، أعلى طريقة @ Bean التي يوجد بها مؤهل مناسب. لا يمكنك أيضًا وضع مؤهل على طريقة ما ، ولكن يمكنك استخدام اسم الحبة كمعلمة مؤهل.
يمكن تحديد اسم الحبة من خلال معامل التعليق Bean ، وهذا هو اسم طريقة المصنع بشكل افتراضي.


ما هي كائنات الوكيل وما أنواع كائنات الوكيل التي يمكن لـ Spring إنشاءها؟

الوكيل هو كائن خاص له نفس الأساليب العامة مثل الفول ، ولكن لديه وظائف إضافية.
نوعان من الوكلاء:


  • JDK الوكيل - وكيل ديناميكي. يتم دمج واجهات برمجة التطبيقات في JDK. انها تحتاج الى واجهة
  • وكيل CGLib - غير مضمّن في JDK. يستخدم عندما تكون واجهة الكائن غير متاحة.

إيجابيات الكائنات الوكيل:


  • السماح لإضافة اضافية. المنطق - إدارة المعاملات ، والأمن ، وقطع الأشجار
  • يفصل بعض الكود (التسجيل ، إلخ) عن المنطق الرئيسي

كيف يتم تنفيذ حبة مفردة؟

إذا لم يكن هناك مثيل للفاصوليا في الحاوية ، فسيتم استدعاء طريقة @ Bean. إذا كان هناك مثيل للفاصوليا ، فسيتم إرجاع الحبة التي تم إنشاؤها بالفعل.


ما هي الملفات الشخصية؟ ما هي أسباب استخدامهم؟

عند استخدام تكوين Java ، يمكنك استخدام التعليق التوضيحي @Profile .
يسمح لك باستخدام إعدادات مختلفة لـ Spring ، اعتمادًا على ملف التعريف المحدد.
يمكن وضعها على فصولConfiguration و Component ، وكذلك على أساليب Bean .


 Profile("!test") //   ,   

 @Bean("dataSource") @Profile("production") public DataSource jndiDataSource() {...} @Bean("dataSource") @Profile("development") public DataSource standaloneDataSource() {...} 

كيفية تضمين قيم بسيطة في العقارات في الربيع؟

يمكنك استخدام التعليقات التوضيحية @Value .
يمكن الحصول على هذه القيم من ملفات الخصائص ، من صناديق ، الخ


 @Value("$some.key") public String stringWithDefaultValue; 

سيتم تضمين سلسلة في هذا المتغير ، على سبيل المثال ، من الخاصية أو من العرض.


كالعادة ، يرجى إرسال التصحيحات أو الأخطاء الموجودة في PM.

Source: https://habr.com/ru/post/ar470305/


All Articles