מה חדש באביב 4.3?

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

המהדורה באביב 4.3 הביאה כמה חידודים נחמדים למיכל הליבה, המטמון, JMS, MVC באינטרנט ובדיקת תת-מודולים של המסגרת.

בפוסט זה נדון בכמה מהשיפורים הללו כולל:

  • הזרקת קונסטרוקטור מרומז
  • תמיכה בשיטות ממשק ברירת מחדל של Java 8
  • שיפור ברזולוציה של תלות
  • חידודים להפשטת מטמון
  • מוּרכָּב @ בקשת מיפוי וריאנטים
  • @Requestscope, @Sessionscope, @Applicationscope הערות
  • @RequestAttribute ו @SessionAttribute ביאורים
  • תמיכה בגרסאות ספריות / שרתי יישומים
  • ה הזרקת פוינט מעמד

2. הזרקת קונסטרוקטור מרומז

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

@Service בכיתה ציבורית FooService {מאגר FooRepository הסופי הפרטי; @ FooService ציבורי אוטומטי (מאגר FooRepository) {this.repository = מאגר}}

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

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

מחלקה ציבורית FooService {מאגר סופי FooRepository פרטי; FooService ציבורי (מאגר FooRepository) {this.repository = מאגר}}

באביב 4.2 ומטה, התצורה הבאה עבור שעועית זו לא תפעל מכיוון ש- Spring לא תוכל למצוא קונסטרוקטור ברירת מחדל עבור FooService. אביב 4.3 הוא חכם יותר ויחווט אוטומטית את הבנאי באופן אוטומטי:

באופן דומה, אולי שמתם לב לכך @תְצוּרָה שיעורים היסטוריים לא תמכו בהזרקת קונסטרוקטור. החל מ -4.3 הם עושים זאת, והם מטבע הדברים מאפשרים השמטה @Autowired בתרחיש של קונסטרוקטור יחיד:

@Configuration בכיתה ציבורית FooConfiguration {מאגר פרטי FooRepository סופי; FooConfiguration ציבורי (מאגר FooRepository) {this.repository = מאגר; } @Bean הציבור FooService fooService () {להחזיר FooService חדש (this.repository); }}

3. תמיכה בשיטות ממשק ברירת מחדל של Java 8

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

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

ממשק ציבורי IDateHolder {void setLocalDate (LocalDate localDate); LocalDate getLocalDate (); חלל ריק ברירת מחדל setStringDate (String stringDate) {setLocalDate (LocalDate.parse (stringDate, DateTimeFormatter.ofPattern ("dd.MM.yyyy"))); }} 

שעועית זו עשויה להיות כעת stringDate רכוש שהוזרק:

כנ"ל לגבי שימוש בהערות בדיקה כמו @ לפני טרנסקשן ו @ AfterTransaction על שיטות ממשק ברירת מחדל. JUnit 5 כבר תומך בהערות הבדיקה שלה על שיטות ממשק ברירת מחדל, ו- Spring 4.3 עוקב אחר ההובלה. כעת תוכלו להפשט לוגיקת בדיקות נפוצה בממשק וליישם אותה בשיעורי מבחן. הנה ממשק למקרי בדיקה שמתעדת הודעות לפני ואחרי עסקאות במבחנים:

ממשק ציבורי ITransactionalTest {Logger log = LoggerFactory.getLogger (ITransactionalTest.class); @BeforeTransaction ברירת מחדל בטלה לפני Transaction () {log.info ("לפני פתיחת העסקה"); } @AfterTransaction ברירת מחדל בטלה afterTransaction () {log.info ("לאחר סגירת העסקה"); }}

שיפור נוסף הנוגע להערות @ לפני העסקה,@ AfterTransaction ו @ Transactional הוא הרפיה בדרישה שהשיטות המבוארות צריכות להיות פּוּמְבֵּי - עכשיו עשויה להיות להם כל רמת נראות.

4. רזולוציה משופרת של תלות

הגרסה החדשה ביותר מציגה גם את ספק אובייקט, הרחבה של הקיים ObjectFactory ממשק עם חתימות שימושיות כגון getIfAvailable ו getIfUnique לאחזר שעועית רק אם היא קיימת או אם ניתן לקבוע מועמד יחיד (בפרט: מועמד ראשוני במקרה של שעועית תואמת מרובה).

@Service בכיתה ציבורית FooService {מאגר FooRepository הסופי הפרטי; FooService ציבורי (RepositoryProvider ObjectProvider) {this.repository = repositoryProvider.getIfUnique (); }}

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

5. חידודים להפשטת מטמון

הפשטת המטמון משמשת בעיקר למטמון ערכים שצורכים מעבד ו- IO. במקרים מסוימים של שימוש, ניתן לבקש מפתח נתון על ידי מספר שרשורים (כלומר לקוחות) במקביל, במיוחד בעת ההפעלה. תמיכה במטמון מסונכרן היא תכונה שהתבקשה זמן רב שהוטמעה כעת. נניח את הדברים הבאים:

@Service בכיתה ציבורית FooService {@Cacheable (cacheNames = "foos", sync = true) Foo getFoo ציבורי (מזהה מחרוזת) {...}}

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

אביב 4.3 גם משפר את הפשטת המטמון באופן הבא:

  • ביטויי SpEL בהערות הקשורות למטמון יכולים כעת להתייחס לשעועית (כלומר @ beanName.method ()).
  • ConcurrentMapCacheManager ו ConcurrentMapCache כעת תומך בסידור רשומות המטמון באמצעות חדש storeByValue תְכוּנָה.
  • @Cacheable, @CacheEvict, @CachePut, ו @ מטמון עשוי לשמש כעת כמטעות-ביאורים ליצירת הערות שהורכבו בהתאמה אישית עם עקיפת תכונות.

6. מורכב @ בקשת מיפוי וריאנטים

מסגרת האביב 4.3 מציגה את הגרסאות הבאות המורכבות ברמת השיטה @ בקשת מיפוי הערה המסייעת לפשט את המיפוי לשיטות HTTP נפוצות ולבטא טוב יותר את הסמנטיקה של שיטת המטפל המבואר.

  • @GetMapping
  • @ פוסט מיפוי
  • @ PutMapping
  • @DeleteMapping
  • @ תיקון מיפוי

לדוגמה, @GetMapping הוא צורת אמירה קצרה יותר @RequestMapping (שיטה = RequestMethod.GET). הדוגמה הבאה מציגה בקר MVC שהופשט באמצעות הלחנה @GetMapping ביאור.

@Controller @RequestMapping ("/ פגישות") פגישות בכיתה פגישה Controller {פרטית סופית פגישות ספר פגישות ספר; @Autowired AppointmentsController (ספר פגישות לתיאום פגישות) {this.appointmentBook = פגישת ספר; } @GetMapping מפה ציבורית get () {החזר פגישהBook.getAppointmentsForToday (); }}

7. @ RequestScope, @SessionScope, @ApplicationScope ביאורים

בעת שימוש ברכיבים מונעי הערות או Java Config, ה- @ RequestScope, @SessionScope ו @ApplicationScope ניתן להשתמש בהערות להקצאת רכיב להיקף הנדרש. ביאורים אלה לא רק מגדירים את היקף השעועית אלא גם מגדירים את מצב ה- proxy המצומצם ScopedProxyMode.TARGET_CLASS.

TARGET_CLASS מצב פירושו ש- proxy של CGLIB ישמש לשרת proxying של שעועית זו ולהבטיח שניתן להזריק אותה בכל שעועית אחרת, אפילו בהיקף רחב יותר. TARGET_CLASS מצב מאפשר שרת proxy לא רק לממשקים אלא גם לשיעורים.

@RequestScope @ Component בכיתה ציבורית LoginAction {// ...}
@SessionScope @Component ClassPreferences UserPreferences {// ...}
@ApplicationScope @ Component public class AppPreferences {// ...}

8. @RequestAttribute ו @SessionAttribute ביאורים

שתי הערות נוספות להזרקת פרמטרים של בקשת HTTP לתוכנה בקר הופיעו שיטות, כלומר @RequestAttribute ו @SessionAttribute. הם מאפשרים לך לגשת לכמה תכונות קיימות מראש, המנוהלות ברחבי העולם (כלומר מחוץ לשטח בקר). הערכים לתכונות אלה עשויים להינתן, למשל, על ידי מופעים רשומים של javax.servlet.Filter אוֹ org.springframework.web.servlet.HandlerInterceptor.

נניח שרשמנו את הדברים הבאים HandlerInterceptor יישום המנתח את הבקשה ומוסיף התחברות פרמטר לפגישה ועוד שאילתא פרמטר לבקשה:

מחלקה ציבורית ParamInterceptor מרחיב את HandlerInterceptorAdapter {@Override pre-Handy בוליאני ציבורי (HttpServletRequest בקשה, HttpServletResponse תגובה, מטפל אובייקט) זורק Exception {request.getSession (). setAttribute ("login", "john"); request.setAttribute ("שאילתה", "חשבוניות"); החזר super.preHandle (בקשה, תגובה, מטפל); }}

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

@GetMapping מחרוזת ציבורית קבל (@SessionAttribute כניסה למחרוזת, שאילתת מחרוזת @RequestAttribute) {return String.format ("login =% s, query =% s", login, query); }

9. תמיכה בגרסאות ספריות / שרתי יישומים

אביב 4.3 תומך בגרסאות הספרייה ודורות השרת הבאים:

  • מצב שינה ORM 5.2 (עדיין תומך ב 4.2 / 4.3 ו- 5.0 / 5.1, עם 3.6 שהושלל כעת)
  • ג'קסון 2.8 (מינימום הועלה לג'קסון 2.6+ החל באביב 4.3)
  • OkHttp 3.x (עדיין תומך OkHttp 2.x זה לצד זה)
  • Netty 4.1
  • Undertow 1.4
  • Tomcat 8.5.2 וכן 9.0 M6

יתר על כן, אביב 4.3 משלב את ASM 5.1 המעודכן ואת Objenesis 2.4 אינץ ' spring-core.jar.

10. הזרקת פוינט

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

סוגי המידע שתוכלו למצוא באמצעות מחלקה זו הם:

  • שדה אובייקט - ניתן להשיג את נקודת ההזרקה עטופה כ- שדה אובייקט באמצעות getField () שיטה אם מזריקים את השעועית לשדה
  • שיטה פרמטר - אתה יכול להתקשר getMethodParameter () שיטה להשגת נקודת ההזרקה עטופה כ- שיטה פרמטר אובייקט אם השעועית מוזרקת לפרמטר
  • חבר - קורא getMember () השיטה תחזיר את הישות המכילה את השעועית המוזרקת עטופה בא חבר לְהִתְנַגֵד
  • מעמד - השג את הסוג המוצהר של הפרמטר או השדה בו הוזרקה השעועית באמצעות getDeclaredType ()
  • ביאור [] - באמצעות getAnnotations () בשיטה, אתה יכול לאחזר מערך של אובייקטים של הערות המייצגים את ההערות המשויכות לשדה או לפרמטר
  • AnnotatedElement - להתקשר getAnnotatedElement () כדי לקבל את נקודת ההזרקה עטופה כ- AnnotatedElement לְהִתְנַגֵד

מקרה בו מחלקה זו שימושית מאוד הוא כאשר אנו רוצים ליצור כּוֹרֵת עֵצִים שעועית על בסיס הכיתה אליה הם משתייכים:

@Bean @Scope ("אב טיפוס") לוגר לוגר ציבורי (InjectionPoint injectionPoint) {להחזיר Logger.getLogger (injectionPoint.getMethodParameter (). GetContainingClass ()); }

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

ואז נוכל להזריק את השעועית לתוכנו AppointmentsController:

@ לוגר לוגר פרטי פרטי;

11. מסקנה

במאמר זה דנו בכמה מהתכונות החדשות שהוצגו עם אביב 4.3.

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

אתה יכול למצוא את קוד המקור של המאמר ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found