spring boot 實(shí)現(xiàn)配置多個(gè)DispatcherServlet最簡(jiǎn)單方式
傳統(tǒng)的web項(xiàng)目,只需要在web.xml里配置多個(gè)即可,并且支持多個(gè)url-pattern
在spring boot中,我們默認(rèn)無(wú)需配置,系統(tǒng)會(huì)自動(dòng)裝配一個(gè),感興趣的可以看下源碼
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
里面有個(gè) DispatcherServletRegistrationBean,關(guān)鍵是這里只能指定一個(gè)path,如下的源碼截圖



如果想要指定多個(gè),我們只能自己寫DispatcherServletRegistrationBean這個(gè)Bean了,那么系統(tǒng)就不會(huì)實(shí)例化內(nèi)置的那個(gè)了,如下代碼
@Autowired
private WebMvcProperties webMvcProperties; @Autowired private MultipartConfigElement multipartConfig;
@Bean @Primary
public DispatcherServletRegistrationBean dispatcherServlet1(DispatcherServlet dispatcherServlet) {
DispatcherServletRegistrationBean registration = new DispatcherServletRegistrationBean(
dispatcherServlet, "/*");
registration.setName("dispatcherServlet1");
registration.setLoadOnStartup(
this.webMvcProperties.getServlet().getLoadOnStartup());
if (this.multipartConfig != null) {
registration.setMultipartConfig(this.multipartConfig);
}
return registration;
}
@Bean
public DispatcherServletRegistrationBean dispatcherServlet2(DispatcherServlet dispatcherServlet) {
DispatcherServletRegistrationBean registration = new DispatcherServletRegistrationBean(
dispatcherServlet, "/aaa/*");
registration.setName("dispatcherServlet2");
registration.setLoadOnStartup(
this.webMvcProperties.getServlet().getLoadOnStartup());
if (this.multipartConfig != null) {
registration.setMultipartConfig(this.multipartConfig);
}
return registration;
}
@Bean
public DispatcherServletRegistrationBean dispatcherServlet3(DispatcherServlet dispatcherServlet) {
DispatcherServletRegistrationBean registration = new DispatcherServletRegistrationBean(
dispatcherServlet, "/bbb/*");
registration.setName("dispatcherServlet3");
registration.setLoadOnStartup(
this.webMvcProperties.getServlet().getLoadOnStartup());
if (this.multipartConfig != null) {
registration.setMultipartConfig(this.multipartConfig);
}
return registration;
}
這樣我們參考底層源碼,我們做了三個(gè)Bean,注意有一個(gè)一定要加上@Primary注解,否則啟動(dòng)會(huì)有報(bào)錯(cuò)。
如果我們系統(tǒng)有一個(gè)接口url是/api/test,那么通過(guò)/aaa/api/test或者/bbb/api/test也都可以訪問了。
不建議的寫法、、、
@Bean
public ServletRegistrationBean apiDispatcherServlet(){
AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
applicationContext.scan("com.be.edge.asset.web.api");
DispatcherServlet apiDispatcherServlet = new DispatcherServlet(applicationContext);
ServletRegistrationBean registrationBean = new ServletRegistrationBean(apiDispatcherServlet);
registrationBean.addInitParameter("throwExceptionIfNoHandlerFound", "true");
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/api/*");
registrationBean.setName("apiDispatcherServlet");
return registrationBean;
}
@Bean
public ServletRegistrationBean mgmtDispatcherServlet(){
AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
applicationContext.scan("com.be.edge.asset.web.controller");
DispatcherServlet apiDispatcherServlet = new DispatcherServlet(applicationContext);
ServletRegistrationBean registrationBean = new ServletRegistrationBean(apiDispatcherServlet);
registrationBean.setLoadOnStartup(2);
registrationBean.addInitParameter("throwExceptionIfNoHandlerFound", "true");
registrationBean.addUrlMappings("/mgmt/*");
registrationBean.setName("mngDispatcherServlet");
return registrationBean;
}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
MyBatis學(xué)習(xí)教程(六)-調(diào)用存儲(chǔ)過(guò)程
這篇文章主要介紹了MyBatis學(xué)習(xí)教程(六)-調(diào)用存儲(chǔ)過(guò)程的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看下吧2016-05-05
SpringCloud災(zāi)難性雪崩效應(yīng)處理方法之降級(jí)實(shí)現(xiàn)流程詳解
這篇文章主要介紹了SpringCloud災(zāi)難性雪崩效應(yīng)處理方法之降級(jí),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧<BR>2022-11-11
IDEA設(shè)置字體隨鼠標(biāo)滾動(dòng)放大縮小的實(shí)現(xiàn)
這篇文章主要介紹了IDEA設(shè)置字體隨鼠標(biāo)滾動(dòng)放大縮小的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
Java基本數(shù)據(jù)類型與封裝類型詳解(int和Integer區(qū)別)
這篇文章主要介紹了Java基本數(shù)據(jù)類型與封裝類型詳解(int和Integer區(qū)別) ,需要的朋友可以參考下2017-02-02

