ההערה של @ ServletComponentScan באתחול האביב

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

במאמר זה נעבור על החדש @ ServletComponentScan ביאור ב מגף אביב.

המטרה היא לתמוך בדברים הבאים סרוולט 3.0 ביאורים:

  • javax.servlet.annotation.WebFilter
  • javax.servlet.annotation.WebListener
  • javax.servlet.annotation.WebServlet

@WebServlet, @WebFilter, ו @WebListener ניתן לרשום שיעורים מוסמכים באופן אוטומטי עם מוטבע סרוולט מיכל על ידי ביאור @ ServletComponentScan על @תְצוּרָה בכיתה ומפרט החבילות.

הצגנו את השימוש הבסיסי של @WebServlet במבוא ל- Java Servlets ו- @WebFilter במבוא ליירוט דפוס סינון בג'אווה. ל @WebListener, תוכלו להציץ במאמר זה המדגים מקרה שימוש טיפוסי של מאזינים לאינטרנט.

2. סרוולטים, מסננים, ו מאזינים

לפני שצוללים @ ServletComponentScanבואו נסתכל כיצד ההערות: @WebServlet, @WebFilter ו @WebListener שימשו בעבר @ ServletComponentScan נכנס לשחק.

2.1. @WebServlet

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

@WebServlet ("/ שלום") מחלקה ציבורית HelloServlet מרחיב את HttpServlet {@Override public void doGet (HttpServletRequest request, HttpServletResponse response) {try {response .getOutputStream () .write ("שלום"); } לתפוס (IOException e) {e.printStackTrace (); }}}

2.2. @WebFilter

ואז מסנן שמסנן בקשות למיקוד "/שלום", ומכין מראש "סינון" לפלט:

@WebFilter ("/ שלום") מעמד ציבורי HelloFilter מיישם את המסנן {// ... @Override public void doFilter (ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) זורק IOException, ServletException {servletResponse .getOutputStream (") מסנן (). ); filterChain.doFilter (servletRequest, servletResponse); } // ...}

2.3. @WebListener

לבסוף, מאזין המגדיר תכונה מותאמת אישית ב- ServletContext:

מחלקה ציבורית @WebListener AttrListener מיישם את ServletContextListener {@Override public void contextInitialized (ServletContextEvent servletContextEvent) {servletContextEvent .getServletContext () .setAttribute ("servlet-context-attr", "test"); } // ...}

2.4. פרוס ל- a סרוולט מְכוֹלָה

כעת, לאחר שבנינו את המרכיבים הבסיסיים של יישום אינטרנט פשוט, אנו יכולים לארוז ולפרוס אותו ל- סרוולט מְכוֹלָה. ניתן לאמת בקלות את ההתנהגות של כל רכיב על ידי פריסת קובץ המלחמה הארוז לתוכו מֵזַח, טומקט או כל סרוולט מכולות התומכות סרוולט 3.0.

3. שימוש @ ServletComponentScan ב מגף אביב

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

בשל העובדה שמכולות משובצות אינן תומכות @WebServlet, @WebFilter ו @WebListener ביאורים, מגף אביב, בהסתמך מאוד על מכולות משובצות, הציג את ההערה החדשה הזו @ ServletComponentScan לתמוך בכמה צנצנות תלויות המשתמשות בשלוש ההערות הללו.

הדיון המפורט ניתן למצוא בגיליון זה ב- Github.

3.1. תלות Maven

להשתמש @ ServletComponentScan, אנחנו צריכים מגף אביב עם גרסה 1.3.0 ומעלה. בואו נוסיף את הגרסה האחרונה של אביב-אתחול-המתנע-הורה ו קפיץ-אתחול-רשת אל ה פום:

 org.springframework.boot spring-boot-starter-parent 1.5.1.RELEASE 
  org.springframework.boot spring-boot-starter-web 1.5.1.RELEASE 

3.2. באמצעות @ ServletComponentScan

ה מגף אביב האפליקציה די פשוטה. אנחנו מוסיפים @ ServletComponentScan כדי לאפשר סריקה עבור @WebFilter, @WebListener ו @WebServlet:

@ServletComponentScan @ SpringBootApplication מחלקה ציבורית SpringBootAnnotatedApp {public static void main (String [] args) {SpringApplication.run (SpringBootAnnotatedApp.class, args); }}

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

@Autowired פרטי TestRestTemplate restTemplate; @Test הציבור בטל givenServletFilter_whenGetHello_thenRequestFiltered () {ResponseEntity responseEntity = restTemplate.getForEntity ("/ שלום", String.class); assertEquals (HttpStatus.OK, responseEntity.getStatusCode ()); assertEquals ("סינון שלום", responseEntity.getBody ()); }
@ Autowired פרטי ServletContext servletContext; @Test public void givenServletContext_whenAccessAttrs_thenFoundAttrsPutInServletListner () {assertNotNull (servletContext); assertNotNull (servletContext.getAttribute ("servlet-context-attr")); assertEquals ("test", servletContext.getAttribute ("servlet-context-attr")); }

3.3. ציין חבילות לסריקה

כברירת מחדל, @ ServletComponentScan יסרוק מחבילה של הכיתה המבוארת. כדי לציין אילו חבילות לסרוק נוכל להשתמש בתכונות שלה:

  • ערך
  • basePackages
  • basePackageClasses

ברירת המחדל ערך תכונה היא כינוי עבור basePackages.

תגיד שלנו SpringBootAnnotatedApp נמצא תחת חבילה com.baeldung.annotation, ואנחנו רוצים לסרוק שיעורים בחבילה com.baeldung.annotation.components נוצר ביישום האינטרנט לעיל, התצורות הבאות שוות ערך:

@ ServletComponentScan
@ServletComponentScan ("com.baeldung.annotation.components")
@ServletComponentScan (basePackages = "com.baeldung.annotation.components")
@ServletComponentScan (basePackageClasses = {AttrListener.class, HelloFilter.class, HelloServlet.class})

4. מתחת למכסה המנוע

ה @ ServletComponentScan ההערה מעובדת על ידי ServletComponentRegisteringPostProcessor. לאחר סריקת חבילות שצוינו עבור @WebFilter, @WebListener ו @WebServlet ביאורים, רשימה של ServletComponentHandlers יעבד את תכונות ההערות שלהם וירשום שעועית סרוקה:

מחלקה ServletComponentRegisteringPostProcessor מיישמת BeanFactoryPostProcessor, ApplicationContextAware {פרטית סופית פרטית רשימה מטפלים; סטטי {List handlers = ArrayList new (); handlers.add (WebServletHandler חדש ()); handlers.add (WebFilterHandler חדש ()); handlers.add (WebListenerHandler חדש ()); מטפלים = Collections.unmodifiableList (מטפלים); } // ... scan void privatePackage (ClassPathScanningCandidateComponentProvider componentProvider, String packageToScan) {// ... עבור (ServletComponentHandler handler: HANDLERS) {handler.handle ((((ScannedGenericBeanDefinition) מועמד), (BeanDefinitionRegistry) טקסט זה). יישום; }}}

כפי שנאמר בג'וואדוק הרשמי, @ ServletComponentScan ההערה פועלת רק בתוך מוטבע סרוולט מכולות, וזה מה שמגיע עם מגף אביב כברירת מחדל.

5. מסקנה

במאמר זה הצגנו @ ServletComponentScan וכיצד ניתן להשתמש בו לתמיכה ביישומים התלויים בכל אחת מההערות: @WebServlet, @WebFilter, @WebListener.

יישום הדוגמאות והקוד ניתן למצוא בפרויקט GitHub.


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