מדריך מהיר להיקפי שעועית אביבית

1. סקירה כללית

במדריך מהיר זה תוכלו ללמוד על סוגים שונים של טווחי שעועית במסגרת האביב.

היקף שעועית מגדיר את מחזור החיים והנראות של אותה שעועית בהקשרים שבהם משתמשים בה.

הגרסה האחרונה של Spring frame מגדירה 6 סוגים של טווחים:

  • קְלָף בּוֹדֵד
  • אב טיפוס
  • בַּקָשָׁה
  • מוֹשָׁב
  • יישום
  • שקע רשת

ארבעת ההיקפים האחרונים שהוזכרו בקשה, מושב, יישום ו שקע רשת זמינים רק ביישום המודע לאינטרנט.

2. היקף סינגלטון

הגדרת שעועית עם קְלָף בּוֹדֵד היקף פירושו שהמכולה יוצר מופע יחיד של אותה שעועית, וכל הבקשות לשם שעועית זה יחזירו את אותו האובייקט שנשמר במטמון. כל שינוי באובייקט יבוא לידי ביטוי בכל ההפניות לשעועית. היקף זה הוא ערך ברירת המחדל אם לא צוין היקף אחר.

בואו ניצור אדם ישות המדגימה את מושג ההיקפים:

אדם בכיתה ציבורית {פרטי שם מחרוזת; // קונסטרוקטור סטנדרטי, גטרים וקובעים}

לאחר מכן, אנו מגדירים את השעועית עם קְלָף בּוֹדֵד היקף באמצעות @תְחוּם ביאור:

@Bean @Scope ("סינגלטון") אדם ציבורי אדם סינגלטון () {להחזיר אדם חדש (); }

אנחנו יכולים גם להשתמש בקבוע במקום ב- חוּט ערך באופן הבא:

@Scope (value = ConfigurableBeanFactory.SCOPE_SINGLETON)

כעת אנו ממשיכים לכתוב מבחן המראה כי שני אובייקטים המתייחסים לאותה שעועית יהיו בעלי אותם ערכים, גם אם רק אחד מהם משנה את מצבם, שכן שניהם מתייחסים לאותו מופע שעועית:

גמר סטטי פרטי פרטי מחרוזת NAME = "ג'ון סמית"; @Test ציבורי בטל givenSingletonScope_whenSetName_thenEqualNames () {ApplicationContext applicationContext = חדש ClassPathXmlApplicationContext ("scopes.xml"); Person personSingletonA = (Person) applicationContext.getBean ("personSingleton"); Person personSingletonB = (Person) applicationContext.getBean ("personSingleton"); personSingletonA.setName (NAME); Assert.assertEquals (NAME, personSingletonB.getName ()); ((AbstractApplicationContext) applicationContext) .close (); }

ה scopes.xml הקובץ בדוגמה זו צריך להכיל את הגדרות ה- XML ​​של הפולים המשמשים:

3. היקף אב-טיפוס

שעועית עם אב טיפוס היקף יחזיר מופע אחר בכל פעם שהוא מתבקש מהמכולה. זה מוגדר על ידי הגדרת הערך אב טיפוס אל ה @תְחוּם ביאור בהגדרת השעועית:

@Bean @Scope ("אב טיפוס") אדם ציבורי אדם Prototype () {להחזיר אדם חדש (); }

נוכל להשתמש בקבוע כמו שעשינו בהיקף הסינגלטון:

@Scope (value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)

כעת נכתוב בדיקה דומה כבעבר המציגה ששני אובייקטים המבקשים את אותו שם שעועית עם אב-טיפוס היקף יהיו במצבים שונים, מכיוון שהם אינם מתייחסים עוד לאותו מופע שעועית:

גמר סטטי פרטי פרטי מחרוזת NAME = "ג'ון סמית"; גמר סטטי פרטי מחרוזת NAME_OTHER = "אנה ג'ונס"; @ מבחן חלל ציבורי givenPrototypeScope_whenSetNames_thenDifferentNames () {ApplicationContext applicationContext = ClassPathXmlApplicationContext חדש ("scopes.xml"); אדם personPrototypeA = (Person) applicationContext.getBean ("personPrototype"); Person personPrototypeB = (Person) applicationContext.getBean ("personPrototype"); personPrototypeA.setName (NAME); personPrototypeB.setName (NAME_OTHER); Assert.assertEquals (NAME, personPrototypeA.getName ()); Assert.assertEquals (NAME_OTHER, personPrototypeB.getName ()); ((AbstractApplicationContext) applicationContext) .close (); } 

ה scopes.xml הקובץ דומה לזה שהוצג בסעיף הקודם תוך הוספת הגדרת ה- xml לשעועית עם אב טיפוס תְחוּם:

4. היקפי אינטרנט מודעים

כאמור, ישנם ארבעה טווחים נוספים הזמינים רק בהקשר יישומי מודע לאינטרנט. אלה משמשים פחות בפועל.

ה בַּקָשָׁה scope יוצר מופע שעועית לבקשת HTTP יחידה בזמן שession היקף יוצר עבור הפעלת HTTP.

ה יישום היקף יוצר את מופע השעועית למחזור החיים של א ServletContext וה שקע רשת היקף יוצר אותו עבור מסוים WebSocket מוֹשָׁב.

בואו ליצור מחלקה לשימוש מיידי של שעועית:

מחלקה ציבורית HelloMessageGenerator {הודעת מחרוזת פרטית; // גטר וקובע סטנדרטי}

4.1. היקף הבקשה

אנחנו יכולים להגדיר את השעועית באמצעות בַּקָשָׁה היקף באמצעות @תְחוּם ביאור:

@Bean @Scope (value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS) public HelloMessageGenerator requestScopedBean () {להחזיר HelloMessageGenerator חדש (); }

ה proxyMode המאפיין הוא הכרחי מכיוון שברגע היישום של הקשר היישום באינטרנט אין בקשה פעילה. אביב ייצור פרוקסי שיוזרק כתלות, וינתן את שעועית היעד כאשר יש צורך בכך בבקשה.

אנו יכולים גם להשתמש ב- @ RequestScope ביאור מורכב המשמש כקיצור דרך להגדרה לעיל:

@Bean @RequestScope הציבור HelloMessageGenerator requestScopedBean () {להחזיר HelloMessageGenerator חדש (); }

בשלב הבא נוכל להגדיר בקר שיש לו הפניה מוזרק ל- requestScopedBean. עלינו לגשת לאותה בקשה פעמיים על מנת לבדוק את ההיקפים הספציפיים באינטרנט.

אם אנו מציגים את הוֹדָעָה בכל פעם שהבקשה מופעלת, אנו יכולים לראות שהערך מאופס ל- ריק, למרות שזה שונה מאוחר יותר בשיטה. הסיבה לכך היא מופע שעועית שונה המוחזר לכל בקשה.

@Controller מחלקה ציבורית ScopesController {@Resource (name = "requestScopedBean") HelloMessageGenerator requestScopedBean; @RequestMapping ("/ scopes / request") ציבורי מחרוזת getRequestScopeMessage (מודל דגם סופי) {model.addAttribute ("previousMessage", requestScopedBean.getMessage ()); requestScopedBean.setMessage ("בוקר טוב!"); model.addAttribute ("currentMessage", requestScopedBean.getMessage ()); להחזיר "scopesExample"; }}

4.2. היקף מושב

אנחנו יכולים להגדיר את השעועית באמצעות מוֹשָׁב היקף באופן דומה:

@Bean @Scope (value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) הפעלה ציבורית HelloMessageGeneratorScopedBean () {להחזיר HelloMessageGenerator חדש (); }

יש גם הערה מורכבת ייעודית בה אנו יכולים להשתמש כדי לפשט את הגדרת השעועית:

@Bean @SessionScope הפעלה ציבורית HelloMessageGeneratorSSopedBean () {להחזיר HelloMessageGenerator חדש (); }

לאחר מכן, אנו מגדירים בקר עם התייחסות ל- sessionScopedBean. שוב, עלינו להפעיל שתי בקשות על מנת להראות שערך ה- הוֹדָעָה שדה זהה עבור ההפעלה.

במקרה זה, כאשר הבקשה מוגשת בפעם הראשונה, הערך הוֹדָעָה הוא ריק. אך ברגע שהוא שונה, ואז הערך נשמר לבקשות הבאות, כאשר אותו מופע של השעועית מוחזר במשך כל ההפעלה.

@Controller מחלקה ציבורית ScopesController {@Resource (name = "sessionScopedBean") HelloMessageGenerator sessionScopedBean; @RequestMapping ("/ scopes / session") מחרוזת ציבורית getSessionScopeMessage (מודל דגם סופי) {model.addAttribute ("previousMessage", sessionScopedBean.getMessage ()); sessionScopedBean.setMessage ("אחר הצהריים טובים!"); model.addAttribute ("currentMessage", sessionScopedBean.getMessage ()); להחזיר "scopesExample"; }}

4.3. היקף היישום

ה יישום היקף יוצר את מופע השעועית למחזור החיים של א ServletContext.

זה דומה להיקף הסינגלטון, אך יש הבדל חשוב מאוד ביחס להיקף השעועית.

כששעועית יישום scoped אותו מופע של השעועית משותף בין מספר יישומים מבוססי servlet הפועלים באותו ServletContext, בעוד שעועית בהיקף יחיד מוגדרת להקשר יישום יחיד בלבד.

בואו ניצור את השעועית עם יישום תְחוּם:

@Bean @Scope (value = WebApplicationContext.SCOPE_APPLICATION, proxyMode = ScopedProxyMode.TARGET_CLASS) יישום HelloMessageGenerator ציבוריScopedBean () {החזר HelloMessageGenerator חדש (); }

באופן אנלוגי באשר ל בַּקָשָׁה ו מוֹשָׁב ניתן להשתמש בגרסה קצרה יותר:

@Bean @ApplicationScope הציבור HelloMessageGenerator applicationScopedBean () {להחזיר HelloMessageGenerator חדש (); }

עכשיו, בואו ניצור בקר שמפנה לשעועית זו:

@Controller מחלקה ציבורית ScopesController {@Resource (name = "applicationScopedBean") HelloMessageGenerator applicationScopedBean; @RequestMapping ("/ scopes / application") ציבורי מחרוזת getApplicationScopeMessage (מודל דגם סופי) {model.addAttribute ("previousMessage", applicationScopedBean.getMessage ()); applicationScopedBean.setMessage ("אחר הצהריים טובים!"); model.addAttribute ("currentMessage", applicationScopedBean.getMessage ()); להחזיר "scopesExample"; }}

במקרה זה, ערך הוֹדָעָה ברגע שהוגדר ב applicationScopedBean יישמר לכל הבקשות, ההפעלות הבאות ואפילו עבור יישום servlet אחר שיגיש לשעועית זו, בתנאי שהיא פועלת באותו ServletContext.

4.4. היקף WebSocket

לבסוף, בואו ניצור את השעועית עם שקע רשת תְחוּם:

@Bean @Scope (scopeName = "שקע רשת", proxyMode = ScopedProxyMode.TARGET_CLASS) ציבורי HelloMessageGenerator websocketScopedBean () {החזר HelloMessageGenerator חדש (); }

שעועית עם WebSocket בהיקף הגישה הראשונה נשמרות ב WebSocket תכונות הפעלה. אותו מופע של השעועית מוחזר לאחר מכן בכל פעם שגישה לשעועית זו נעשית במהלך כל התהליך WebSocket מוֹשָׁב.

אנו יכולים גם לומר שהוא מציג התנהגות של יחיד אך מוגבל לא WebSocket מושב בלבד.

5. מסקנה

הדגמנו טווחי שעועית שונים שסופקו על ידי אביב ומה השימושים המיועדים להם.

את היישום של הדרכה זו ניתן למצוא בפרויקט GitHub - זהו פרויקט מבוסס Eclipse, כך שיהיה קל לייבא ולהפעיל אותו כפי שהוא.