Bilješka @ServletComponentScan u proljetnom pokretanju

1. Pregled

U ovom ćemo članku proći kroz novo @ServletComponentScan bilješka u Proljetni čizme.

Cilj je podržati sljedeće Servlet 3.0 napomene:

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

@WebServlet, @WebFilter, i @WebListener komentirane klase mogu se automatski registrirati s ugrađenim Servlet spremnik označavanjem @ServletComponentScan na a @Konfiguracija klase i navođenje paketa.

Uveli smo osnovnu uporabu @WebServlet u Uvodu u Java Servlets i @WebFilter u Uvod u presretanje uzorka filtra na Javi. Za @WebListener, možete zaviriti u ovaj članak koji pokazuje tipičan slučaj upotrebe web slušatelja.

2. Servleti, Filteri, i Slušatelji

Prije uranjanja u @ServletComponentScan, pogledajmo kako su napomene: @WebServlet, @WebFilter i @WebListener su korištene prije @ServletComponentScan ušao u igru.

2.1. @WebServlet

Sada ćemo prvo definirati a Servlet koja služi DOBITI zahtjeva i odgovara "zdravo":

@WebServlet ("/ hello") javna klasa HelloServlet proširuje HttpServlet {@Override public void doGet (HttpServletRequest zahtjev, HttpServletResponse odgovor) {try {response .getOutputStream () .write ("hello"); } catch (IOException e) {e.printStackTrace (); }}}

2.2. @WebFilter

Zatim filtar koji filtrira zahtjeve za ciljanje "/zdravo", i prependira "Filtriranje" na izlaz:

@WebFilter ("/ hello") javna klasa HelloFilter implementira Filter {// ... @Override public void doFilter (ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) baca IOException, ServletException {servletRespotint. "Filter. ); filterChain.doFilter (servletRequest, servletResponse); } // ...}

2.3. @WebListener

Konačno, slušatelj koji postavlja prilagođeni atribut u ServletContext:

Javna klasa @WebListener AttrListener implementira ServletContextListener {@Override public void contextInitialized (ServletContextEvent servletContextEvent) {servletContextEvent .getServletContext () .setAttribute ("servlet-context-attr; } // ...}

2.4. Raspored u a Servlet Spremnik

Sada kada smo izgradili osnovne komponente jednostavne web aplikacije, možemo ih spakirati i rasporediti u Servlet kontejner. Ponašanje svake komponente može se lako provjeriti postavljanjem pakirane ratne datoteke u Brana, Mačak ili bilo koji drugi Servlet spremnici koji podupiru Servlet 3.0.

3. Korištenje @ServletComponentScan u Proljetni čizme

Možda se pitate jer te bilješke možemo koristiti u većini Servlet kontejneri bez ikakve konfiguracije, zašto nam trebaju @ServletComponentScan? Problem leži u ugrađenom Servlet kontejneri.

Zbog činjenice da ugrađeni spremnici ne podržavaju @WebServlet, @WebFilter i @WebListener bilješke, Spring Boot, oslanjajući se uvelike na ugrađene spremnike, uveo je ovu novu napomenu @ServletComponentScan za podršku nekim ovisnim staklenkama koje koriste ove 3 bilješke.

Detaljnu raspravu možete pronaći u ovom izdanju na Githubu.

3.1. Ovisnosti Mavena

Koristiti @ServletComponentScan, trebamo Proljetni čizme s verzijom 1.3.0 ili novijom. Dodajmo najnoviju verziju proljeće-čizma-starter-roditelj i proljeće-boot-starter-web prema pom:

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

3.2. Koristeći @ServletComponentScan

The Proljetni čizme aplikacija je prilično jednostavna. Mi dodajemo @ServletComponentScan kako bi se omogućilo skeniranje za @WebFilter, @WebListener i @WebServlet:

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

Bez ikakvih promjena u prethodnoj web aplikaciji, ona samo radi:

@Autowired private TestRestTemplate restTemplate; @Test javna praznina givenServletFilter_whenGetHello_thenRequestFiltered () {ResponseEntity responseEntity = restTemplate.getForEntity ("/ hello", String.class); assertEquals (HttpStatus.OK, responseEntity.getStatusCode ()); assertEquals ("filtriranje zdravo", responseEntity.getBody ()); }
@Autowired private ServletContext servletContext; @Test javna praznina givenServletContext_whenAccessAttrs_thenFoundAttrsPutInServletListner () {assertNotNull (servletContext); assertNotNull (servletContext.getAttribute ("servlet-context-attr")); assertEquals ("test", servletContext.getAttribute ("servlet-context-attr")); }

3.3. Navedite pakete za skeniranje

Prema zadanim postavkama, @ServletComponentScan skenirat će iz paketa označene klase. Da bismo odredili koje pakete skenirati, možemo koristiti njegove atribute:

  • vrijednost
  • basePackages
  • basePackageClasses

Zadana vrijednost vrijednost atribut je zamjensko ime za basePackages.

Recite naše SpringBootAnnotatedApp je pod paketom com.baeldung.notacija, a mi želimo skenirati klase u paketu com.baeldung.annotation.components stvorene u gornjoj web aplikaciji, sljedeće su konfiguracije jednake:

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

4. Ispod haube

The @ServletComponentScan bilješku obrađuje ServletComponentRegisteringPostProcessor. Nakon skeniranja navedenih paketa za @WebFilter, @WebListener i @WebServlet bilješke, popis ServletComponentHandlers će obraditi njihove atribute bilješki i registrirati skenirani grah:

klasa ServletComponentRegisteringPostProcessor implementira BeanFactoryPostProcessor, ApplicationContextAware {privatni statički konačni popis HANDLERS; static {Obrađivači popisa = novi ArrayList (); handlers.add (novi WebServletHandler ()); handlers.add (novi WebFilterHandler ()); handlers.add (novi WebListenerHandler ()); HANDLERS = Collections.unmodifiableList (handlers); } // ... ... private void scanPackage (ClassPathScanningCandidateComponentProvider componentProvider, String packageToScan) {// ... for (ServletComponentHandler handler: HANDLERS) {handler.handle ((((ScannedGenericBeanDefinition) this), (BeanDegistryDefinition); }}}

Kao što je rečeno u službenom Javadocu, @ServletComponentScan napomena djeluje samo u ugrađenom Servlet kontejneri, što je ono što dolazi s Proljetni čizme prema zadanim postavkama.

5. Zaključak

U ovom smo članku predstavili @ServletComponentScan i kako se može koristiti za podršku aplikacijama koje ovise o bilo kojoj od napomena: @WebServlet, @WebFilter, @WebListener.

Primjena primjera i koda može se naći u projektu GitHub.


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