A @ServletComponentScan kommentár a tavaszi rendszerindításban

1. Áttekintés

Ebben a cikkben átnézzük az újat @ServletComponentScan annotáció Tavaszi csizma.

A cél a következők támogatása Servlet 3.0 kommentárok:

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

@WebServlet, @WebFilter, és @WebListener a jegyzetekkel ellátott osztályok automatikusan regisztrálhatók egy beágyazottal Servlet konténer feljegyzéssel @ServletComponentScan rajta @ Konfiguráció osztály és a csomagok megadása.

Bevezettük a @WebServlet a Java Servlet-ek bevezetése és @WebFilter a Bevezetés a Java szűrőminta elfogására. Mert @WebListener, bepillanthat ebbe a cikkbe, amely bemutatja a webes hallgatók tipikus használati esetét.

2. Servletek, Szűrők, és Hallgatók

Mielőtt belevágna @ServletComponentScan, vessünk egy pillantást arra, hogy a kommentárok: @WebServlet, @WebFilter és @WebListener korábban használták @ServletComponentScan játékba került.

2.1. @WebServlet

Most először meghatározzuk a Servlet hogy szolgál KAP kéri és válaszol "Helló":

@WebServlet ("/ hello") public class HelloServlet kiterjeszti a HttpServlet {@Orride public void doGet (HttpServletRequest kérés, HttpServletResponse válasz) {try {válasz .getOutputStream () .write ("hello"); } catch (IOException e) {e.printStackTrace (); }}}

2.2. @WebFilter

Ezután egy szűrő, amely szűri a célzási kéréseket "/Helló", és előkészíti „Szűrés” a kimenetre:

A @WebFilter ("/ hello") public class HelloFilter a (z) {// ... Filter szűrőt valósítja meg. ); filterChain.doFilter (servletRequest, servletResponse); } // ...}

2.3. @WebListener

Végül egy hallgató, amely egyéni attribútumot állít be ServletContext:

@WebListener public class Az AttrListener megvalósítja a ServletContextListener {@Orride public void contextInitialized (ServletContextEvent servletContextEvent) {servletContextEvent .getServletContext () .setAttribute ("servlet-context-attr", "teszt"); } // ...}

2.4. Telepítés a Servlet Tartály

Most, hogy elkészítettük egy egyszerű webalkalmazás alapkomponenseit, csomagolhatjuk és telepíthetjük a Servlet tartály. Minden összetevő viselkedése könnyen ellenőrizhető a csomagolt háborús fájl telepítésével Móló, Kandúr vagy bármi Servlet konténerek, amelyek támogatják Servlet 3.0.

3. Használata @ServletComponentScan ban ben Tavaszi csizma

Kíváncsi lehet, mivel a legtöbbet használhatjuk ezeket a jegyzeteket Servlet konténerek konfiguráció nélkül, miért van szükségünk rá @ServletComponentScan? A probléma a beágyazottságban rejlik Servlet konténerek.

Annak a ténynek köszönhetően, hogy a beágyazott konténerek nem támogatják @WebServlet, @WebFilter és @WebListener kommentárok, Tavaszi csizma, nagyban támaszkodva a beágyazott konténerekre, bevezette ezt az új kommentárt @ServletComponentScan hogy támogasson néhány függő tégelyt, amelyek ezt a 3 jegyzetet használják.

A részletes vita a Github e számában található.

3.1. Maven-függőségek

Használni @ServletComponentScan, szükségünk van Tavaszi csizma 1.3.0 vagy újabb verzióval. Adjuk hozzá a legfrissebb verzióját tavasz-bakancs-induló-szülő és tavasz-boot-starter-web hoz pom:

 org.springframework.boot spring-boot-starter-parent 1.5.1.FELHASZNÁLÁS 
  org.springframework.boot spring-boot-starter-web 1.5.1.FELHASZNÁLÁS 

3.2. Használata @ServletComponentScan

A Tavaszi csizma app nagyon egyszerű. Hozzátesszük @ServletComponentScan engedélyezéséhez @WebFilter, @WebListener és @WebServlet:

@ServletComponentScan @SpringBootApplication public class SpringBootAnnotatedApp {public static void main (String [] args) {SpringApplication.run (SpringBootAnnotatedApp.class, args); }}

Az előző webalkalmazás változtatása nélkül csak működik:

@Autowired private TestRestTemplate restTemplate; @Test public void givenServletFilter_whenGetHello_thenRequestFiltered () {ResponseEntity responseEntity = restTemplate.getForEntity ("/ hello", String.class); assertEquals (HttpStatus.OK, responseEntity.getStatusCode ()); assertEquals ("szia szűrése", responseEntity.getBody ()); }
@Autowired private ServletContext servletContext; @Test public void givenServletContext_whenAccessAttrs_thenFoundAttrsPutInServletListner () {assertNotNull (servletContext); assertNotNull (servletContext.getAttribute ("servlet-context-attr")); assertEquals ("teszt", servletContext.getAttribute ("servlet-context-attr")); }

3.3. Adja meg az átvizsgálandó csomagokat

Alapértelmezés szerint, @ServletComponentScan az annotált osztály csomagjából fog beolvasni. Az átvizsgálandó csomagok megadásához használhatjuk annak attribútumait:

  • érték
  • basePackages
  • basePackageClasses

Az alapértelmezett érték attribútum egy álneve a basePackages.

Mondd a mi SpringBootAnnotatedApp csomag alatt van com.baeldung.annotation, és az osztályokat csomagban szeretnénk beolvasni com.baeldung.annotation.components a fenti webalkalmazásban létrehozva a következő konfigurációk egyenértékűek:

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

4. A motorháztető alatt

A @ServletComponentScan az annotációt a ServletComponentRegistringPostProcessor. A megadott csomagok keresése után @WebFilter, @WebListener és @WebServlet jegyzetek, egy lista ServletComponentHandlers feldolgozza az annotációs attribútumaikat és regisztrálja a beolvasott babokat:

osztály ServletComponentRegistringPostProcessor implementálja a BeanFactoryPostProcessor, ApplicationContextAware {private static final List HANDLERS; statikus {Listakezelők = new ArrayList (); handlers.add (új WebServletHandler ()); handlers.add (új WebFilterHandler ()); handlers.add (új WebListenerHandler ()); KEZELŐK = Gyűjtemények.módosíthatatlanLista (kezelők); } // ... private void scanPackage (ClassPathScanningCandidateComponentProvider componentProvider, String packageToScan) {// ... a (ServletComponentHandler kezelő: HANDLERS) {handler.handle (((ScannedGenericBeanDefinition) jelölt), (BeanDefinitionRegication) }}}

Ahogy a hivatalos Javadoc is mondta @ServletComponentScan az annotáció csak beágyazottan működik Servlet konténerek, ami ezzel jár Tavaszi csizma alapértelmezés szerint.

5. Következtetés

Ebben a cikkben bemutattuk @ServletComponentScan és hogyan használható bármelyik kommentártól függő alkalmazások támogatására: @WebServlet, @WebFilter, @WebListener.

A példák és kódok megvalósítása megtalálható a GitHub projektben.