日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring中WebApplicationInitializer的理解

發(fā)布時間:2023/11/29 javascript 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring中WebApplicationInitializer的理解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

現(xiàn)在JavaConfig配置方式在逐步取代xml配置方式。而WebApplicationInitializer可以看做是Web.xml的替代,它是一個接口。通過實現(xiàn)WebApplicationInitializer,在其中可以添加servlet,listener等,在加載Web項目的時候會加載這個接口實現(xiàn)類,從而起到web.xml相同的作用。下面就看一下這個接口的詳細內(nèi)容。

? ? ?首先打開這個接口,如下:

public interface WebApplicationInitializer {void onStartup(ServletContext var1) throws ServletException; }

只有一個方法,看不出什么頭緒。但是,在這個包下有另外一個類,SpringServletContainerInitializer。它的實現(xiàn)如下:

package org.springframework.web;import java.lang.reflect.Modifier; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Set; import javax.servlet.ServletContainerInitializer; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.HandlesTypes; import org.springframework.core.annotation.AnnotationAwareOrderComparator;@HandlesTypes({WebApplicationInitializer.class}) public class SpringServletContainerInitializer implements ServletContainerInitializer {public SpringServletContainerInitializer() {}public void onStartup(Set<Class<?>> webAppInitializerClasses, ServletContext servletContext) throws ServletException {List<WebApplicationInitializer> initializers = new LinkedList();Iterator var4;if(webAppInitializerClasses != null) {var4 = webAppInitializerClasses.iterator();while(var4.hasNext()) {Class<?> waiClass = (Class)var4.next();if(!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers()) && WebApplicationInitializer.class.isAssignableFrom(waiClass)) {try {initializers.add((WebApplicationInitializer)waiClass.newInstance());} catch (Throwable var7) {throw new ServletException("Failed to instantiate WebApplicationInitializer class", var7);}}}}if(initializers.isEmpty()) {servletContext.log("No Spring WebApplicationInitializer types detected on classpath");} else {servletContext.log(initializers.size() + " Spring WebApplicationInitializers detected on classpath");AnnotationAwareOrderComparator.sort(initializers);var4 = initializers.iterator();while(var4.hasNext()) {WebApplicationInitializer initializer = (WebApplicationInitializer)var4.next();initializer.onStartup(servletContext);}}} }

這個類就比較有意思了,先不管其他的,讀一下這段代碼,可以得到這樣的意思。

? ? ? ? ? ? ?先判斷webAppInitializerClasses這個Set是否為空。如果不為空的話,找到這個set中不是接口,不是抽象類,并且是

WebApplicationInitializer接口實現(xiàn)類的類,將它們保存到list中。當這個list為空的時候,拋出異常。不為空的話就按照一定的順序排序,并將它們按照一定的順序?qū)嵗U{(diào)用其onStartup方法執(zhí)行。到這里,就可以解釋WebApplicationInitializer實現(xiàn)類的工作過程了。但是,在web項目運行的時候,SpringServletContainerInitializer這個類又是怎樣被調(diào)用的呢。

? ? ? ? ? ?它只有一個接口,ServletContainerInitializer,通過它就可以解釋SpringServletContainerInitializer是如何被調(diào)用的。它的內(nèi)容如下:

package javax.servlet;import java.util.Set;public interface ServletContainerInitializer {void onStartup(Set<Class<?>> var1, ServletContext var2) throws ServletException; }

首先,這個接口是javax.servlet下的。官方的解釋是這樣的:為了支持可以不使用web.xml。提供了ServletContainerInitializer,它可以通過SPI機制,當啟動web容器的時候,會自動到添加的相應(yīng)jar包下找到META-INF/services下以ServletContainerInitializer的全路徑名稱命名的文件,它的內(nèi)容為ServletContainerInitializer實現(xiàn)類的全路徑,將它們實例化。既然這樣的話,那么SpringServletContainerInitializer作為ServletContainerInitializer的實現(xiàn)類,它的jar包下也應(yīng)該有相應(yīng)的文件。打開查看如下:

哈,現(xiàn)在就可以解釋清楚了。首先,SpringServletContainerInitializer作為ServletContainerInitializer的實現(xiàn)類,通過SPI機制,在web容器加載的時候會自動的被調(diào)用。(這個類上還有一個注解@HandlesTypes,它的作用是將感興趣的一些類注入到ServletContainerInitializerde), 而這個類的方法又會掃描找到WebApplicationInitializer的實現(xiàn)類,調(diào)用它的onStartup方法,從而起到啟動web.xml相同的作用。

? ? ? ? ?然后,我們自己通過一個實例來實現(xiàn)相同的功能,通過一樣的方式來訪問一個servlet。

? ? ? ??

? ? ? ? ?1、定義接口WebParameter,它就相當于WebApplicationInitializer。內(nèi)容如下:

public interface WebParameter {void loadOnstarp(ServletContext servletContext); }

可以在這里面添加servlet,listener等。

2、定義Servlet。

public class MyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("TestSetvlet");} }

3、定義MyWebParameter作為WebParameter的實現(xiàn)類,將Servlet添加到上下文,并設(shè)置好映射。

public class MyWebParameter implements WebParameter {public void loadOnstarp(ServletContext servletContext) {ServletRegistration.Dynamic testSetvelt=servletContext.addServlet("test","com.test.servlet.MyServlet");testSetvelt.setLoadOnStartup(1);testSetvelt.addMapping("/test");} }

當然,也可以把第2步和第3步合在一起:

public class MyServlet extends HttpServlet implements WebParameter {@Overridepublic void loadOnstarp(ServletContext servletContext) {ServletRegistration.Dynamic testSetvelt=servletContext.addServlet("test","com.test.servlet.MyServlet");testSetvelt.setLoadOnStartup(1);testSetvelt.addMapping("/test");}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("TestSetvlet");} }

而且以后可以將Spring的applicationContext.xml與web.xml融合在一個類中。即注解為@Configuration,并實現(xiàn)WebApplicationInitializer。

4、定義好WebConfig作為ServletContainerInitializer的實現(xiàn)類,它的作用是掃描找到WebParameter的實現(xiàn)類,并調(diào)用其方法。

@HandlesTypes({WebParameter.class}) public class WebConfig implements ServletContainerInitializer {public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {Iterator var4;if (set!=null){var4=set.iterator();while(var4.hasNext()){Class<?> clazz= (Class<?>) var4.next();if (!clazz.isInterface()&& !Modifier.isAbstract(clazz.getModifiers())&&WebParameter.class.isAssignableFrom(clazz)){try {((WebParameter) clazz.newInstance()).loadOnstarp(servletContext);}catch (Exception e){e.printStackTrace();}}}}} }

??5、根據(jù)SPI機制,定義一個META-INF/services文件夾,并在其下定義相關(guān)文件名稱,并將WebConfig的類全名稱填入其中。

6、最終結(jié)果:

?

?

?

本文轉(zhuǎn)自:https://blog.csdn.net/zq17865815296/article/details/79464403

轉(zhuǎn)載于:https://www.cnblogs.com/nizuimeiabc1/p/11031150.html

總結(jié)

以上是生活随笔為你收集整理的Spring中WebApplicationInitializer的理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。