Anotácia @ServletComponentScan v Spring Boot

1. Prehľad

V tomto článku si prejdeme nové @ServletComponentScan anotácia v Jarná topánka.

Cieľom je podporiť nasledujúce Servlet 3.0 anotácie:

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

@WebServlet, @WebFiltera @WebListener anotované triedy je možné automaticky zaregistrovať pomocou vloženého súboru Servlet kontajner anotovaním @ServletComponentScan na a @ Konfigurácia triedy a s uvedením balíkov.

Zaviedli sme základné použitie @WebServlet v Úvod do Java servletov a @WebFilter v Úvod do zachytávania vzorov filtra v Jave. Pre @WebListener, môžete sa pozrieť na tento článok, ktorý ukazuje typický prípad použitia webových poslucháčov.

2. Servlety, Filtrea Poslucháči

Pred ponorom do @ServletComponentScan, poďme sa pozrieť na to, ako anotácie: @WebServlet, @WebFilter a @WebListener boli použité predtým @ServletComponentScan vstúpil do hry.

2.1. @WebServlet

Teraz najskôr definujeme a Servlet to slúži ZÍSKAJTE žiada a odpovedá "Ahoj":

@WebServlet ("/ hello") verejná trieda HelloServlet rozširuje HttpServlet {@Override public void doGet (požiadavka HttpServletRequest, odpoveď HttpServletResponse) {try {response .getOutputStream () .write ("hello"); } catch (IOException e) {e.printStackTrace (); }}}

2.2. @WebFilter

Potom filter, ktorý filtruje žiadosti o zacielenie "/Ahoj"a predčíta sa „Filtrovanie“ na výstup:

@WebFilter ("/ ahoj") verejná trieda HelloFilter implementuje filter {// ... @Override public void doFilter (ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) hodí IOException, ServletException {servletResponse .getOutputStream (). ); filterChain.doFilter (servletRequest, servletResponse); } // ...}

2.3. @WebListener

Nakoniec poslucháč, ktorý nastaví vlastný atribút ServletContext:

@WebListener verejná trieda AttrListener implementuje ServletContextListener {@Override public void contextInitialized (ServletContextEvent servletContextEvent) {servletContextEvent .getServletContext () .setAttribute ("servlet-context-attr", "test"); } // ...}

2.4. Nasadiť do a Servlet Kontajner

Teraz, keď sme vytvorili základné súčasti jednoduchej webovej aplikácie, môžeme ju zabaliť a nasadiť do Servlet kontajner. Správanie sa každého komponentu možno ľahko overiť nasadením zabaleného vojnového súboru do Mólo, Tomcat alebo hocijaké Servlet kontajnery, ktoré podopierajú Servlet 3.0.

3. Používanie @ServletComponentScan v Jarná topánka

Možno by ste sa čudovali, pretože tieto anotácie môžeme použiť najviac Servlet kontajnery bez akejkoľvek konfigurácie, prečo potrebujeme @ServletComponentScan? Problém spočíva v zabudovaní Servlet nádob.

Vzhľadom na skutočnosť, že vložené kontajnery nepodporujú @WebServlet, @WebFilter a @WebListener anotácie, Jarná topánka, keďže sa vo veľkej miere spolieha na vložené kontajnery, predstavil túto novú anotáciu @ServletComponentScan na podporu niektorých závislých nádob, ktoré používajú tieto 3 poznámky.

Podrobnú diskusiu nájdete v tomto čísle na serveri Github.

3.1. Maven závislosti

Použit @ServletComponentScan, potrebujeme Jarná topánka s verziou 1.3.0 alebo novšou. Pridajme najnovšiu verziu servera pružina-štartér-štartér-rodič a spring-boot-starter-web do pom:

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

3.2. Použitím @ServletComponentScan

The Jarná topánka aplikácia je veľmi jednoduchá. Pridáme @ServletComponentScan povoliť prehľadávanie @WebFilter, @WebListener a @WebServlet:

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

Bez zmeny predchádzajúcej webovej aplikácie to jednoducho funguje:

@Autowired private TestRestTemplate restTemplate; @Test public void givenServletFilter_whenGetHello_thenRequestFiltered () {ResponseEntity responseEntity = restTemplate.getForEntity ("/ hello", String.class); assertEquals (HttpStatus.OK, responseEntity.getStatusCode ()); assertEquals ("filtrovanie ahoj", responseEntity.getBody ()); }
@Autowired private 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. Zadajte skenované balíčky

Predvolene, @ServletComponentScan prehľadá z balíka anotovanej triedy. Na určenie, ktoré balíčky sa majú prehľadať, môžeme použiť jeho atribúty:

  • hodnotu
  • basePackages
  • basePackageClasses

Predvolená hodnota hodnotu attribute je alias pre basePackages.

Povedz naše SpringBootAnnotatedApp je v balíku com.baeldung.anotáciaa chceme skenovať triedy v balíku com.baeldung.annotation.components vo vyššie uvedenej webovej aplikácii sú ekvivalentné nasledujúce konfigurácie:

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

4. Pod kapotou

The @ServletComponentScan anotáciu spracoval ServletComponentRegisteringPostProcessor. Po skenovaní určených balíkov pre @WebFilter, @WebListener a @WebServlet anotácie, zoznam ServletComponentHandlers spracuje ich atribúty anotácií a zaregistruje naskenované fazule:

trieda ServletComponentRegisteringPostProcessor implementuje BeanFactoryPostProcessor, ApplicationContextAware {private static final List HANDLERS; static {Zoznam manipulátorov = nový ArrayList (); handlers.add (nový WebServletHandler ()); handlers.add (nový WebFilterHandler ()); handlers.add (nový WebListenerHandler ()); HANDLERS = Collections.unmodifiableList (obsluhovatelia); } // ... private void scanPackage (ClassPathScanningCandidateComponentProvider componentProvider, String packageToScan) {// ... for (ServletComponentHandler handler: HANDLERS) {handler.handle (((ScannedGenericBeanDefinition) candidate), (BeanDefinitionRegistry) this.application }}}

Ako sa uvádza v oficiálnom Javadocu, @ServletComponentScan anotácia funguje iba vo vložených Servlet nádob, čo je súčasťou Jarná topánka predvolene.

5. Záver

V tomto článku sme si predstavili @ServletComponentScan a ako sa dá použiť na podporu aplikácií, ktoré závisia od ktorejkoľvek z anotácií: @WebServlet, @WebFilter, @WebListener.

Implementáciu príkladov a kódu nájdete v projekte GitHub.


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