SpringMVC?bean實(shí)現(xiàn)加載控制方法詳解
1、Spring配置類排除加載SpringMVC的bean
SpringMVC 通常只需要加載 controller 包內(nèi)的 bean,而 Spring 需要加載 dao 和 service 包內(nèi)的 bean,為了省事,Spring 配置類經(jīng)常設(shè)置掃描的包為一個(gè)大范圍的包(包含 dao 和 service 在內(nèi)的包),此時(shí) Spring 會(huì)錯(cuò)誤或者多余地加載到 controller 包內(nèi)的 bean
使 Spring 排除加載 SpringMVC 的 bean 一般有兩種方法
- 方法 1:掃描包時(shí)精確掃描需要的包,而不用大范圍的掃描
- 方法 2:大范圍掃描,但是將不需要的 bean 過濾掉
方法 1 示例:
@Configuration // 使 Spring 只掃描 dao 與 service 包 @ComponentScan({"com.mzz.dao", "com.mzz.service"}) public class SpringConfig { }
方法 2:在 @ComponentScan 注解中可以設(shè)置 excludeFilters 屬性排除掉 不需要的 bean,excludeFilters 屬性的值是一個(gè) Filter 注解,這個(gè)注解也在 ComponentScan 內(nèi),需要設(shè)置 type(過濾類型) 和 classes
下面的示例表示 Spring 的掃描范圍為 com.mzz 但是按注解類型過濾掉所有注解了 @Controller 的 bean
@Configuration @ComponentScan(value = "com.mzz", excludeFilters = @ComponentScan.Filter( type = FilterType.ANNOTATION, // 按照 注解 來進(jìn)行過濾 classes = {Controller.class} // 過濾所有注解了 @Controller 的 bean ) ) public class SpringConfig { }
由于 Filter 注解中 type 的默認(rèn)值就是 FilterType.ANNOTATION,所以上面的代碼可以簡(jiǎn)寫成這樣:
@Configuration @ComponentScan(value = "com.mzz", excludeFilters = @ComponentScan.Filter({Controller.class}) ) public class SpringConfig { }
[補(bǔ)充]
當(dāng) Spring 和 SpringMVC 的配置類同時(shí)存在時(shí),上述的方法二可能不會(huì)生效,原因是 Spring 進(jìn)行大范圍掃描時(shí)可以掃描到 SpringMVC 的配置類,于是 SpringMVC 中的 bean 也被加載到 Spring 中
此時(shí)也有兩種解決方法
一是將 SpringMVC 的配置類移動(dòng)到 Spring 掃描不到的包下(比如 com 包下)
二是 Spring 過濾時(shí)也將 SpringMVC 的配置類過濾掉,SpringMVC 的配置類會(huì)注解 @Configuration 和 @ComponentScan,可以對(duì)其進(jìn)行過濾
@Configuration @ComponentScan(value = "com.mzz", excludeFilters = @ComponentScan.Filter({Controller.class, ComponentScan.class}) ) public class SpringConfig { }
2、Servlet容器配置類簡(jiǎn)潔開發(fā)
public class ServletContainerInitConfig extends AbstractDispatcherServletInitializer { // 加載 springMVC 容器配置 @Override protected WebApplicationContext createServletApplicationContext() { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); ctx.register(SpringMvcConfig.class); return ctx; } @Override protected String[] getServletMappings() { return new String[]{"/"}; } // 加載 spring 容器配置 @Override protected WebApplicationContext createRootApplicationContext() { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); ctx.register(SpringConfig.class); return ctx; } }
上面的類繼承自 AbstractDispatcherServletInitializer 抽象類,改為繼承 AbstractAnnotationConfigDispatcherServletInitializer 抽象類。則只需將配置類 class 返回即可,而不需要手動(dòng)創(chuàng)建 Context,如下
public class ServletContainerInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class[]{SpringConfig.class}; } // 加載 springMVC 容器配置 @Override protected Class<?>[] getServletConfigClasses() { return new Class[]{SpringMvcConfig.class}; } @Override protected String[] getServletMappings() { return new String[]{"/"}; } }
視頻鏈接:傳送門
到此這篇關(guān)于SpringMVC bean實(shí)現(xiàn)加載控制方法詳解的文章就介紹到這了,更多相關(guān)SpringMVC bean加載控制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java對(duì)象與json對(duì)象之間互相轉(zhuǎn)換實(shí)現(xiàn)方法示例
這篇文章主要介紹了java對(duì)象與json對(duì)象之間互相轉(zhuǎn)換實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了java對(duì)象與json對(duì)象相互轉(zhuǎn)換實(shí)現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-10-10Java利用Netty時(shí)間輪實(shí)現(xiàn)延時(shí)任務(wù)
時(shí)間輪是一種可以執(zhí)行定時(shí)任務(wù)的數(shù)據(jù)結(jié)構(gòu)和算法。本文將為大家詳細(xì)講解一下Java如何利用Netty時(shí)間輪算法實(shí)現(xiàn)延時(shí)任務(wù),感興趣的小伙伴可以了解一下2022-08-08Java 中二進(jìn)制轉(zhuǎn)換成十六進(jìn)制的兩種實(shí)現(xiàn)方法
這篇文章主要介紹了Java 中二進(jìn)制轉(zhuǎn)換成十六進(jìn)制的兩種實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下2017-06-06Spring多數(shù)據(jù)源導(dǎo)致配置失效的解決
這篇文章主要介紹了Spring多數(shù)據(jù)源導(dǎo)致配置失效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01java實(shí)現(xiàn)斐波那契數(shù)列的3種方法
這篇文章主要介紹了java實(shí)現(xiàn)斐波那契數(shù)列的3種方法,有需要的朋友可以參考一下2014-01-01Java遠(yuǎn)程調(diào)用Shell腳本并獲取輸出信息【推薦】
這篇文章主要介紹了Java遠(yuǎn)程調(diào)用Shell腳本并獲取輸出信息,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09mybatisplus的連表增強(qiáng)插件mybatis plus join
本文主要介紹了mybatisplus的連表增強(qiáng)插件mybatis plus join,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06