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.