ההערה של @ 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.