最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringMVC?bean實現(xiàn)加載控制方法詳解

 更新時間:2022年08月30日 10:07:38   作者:mzz124  
SpringMVC是一種基于Java,實現(xiàn)了Web?MVC設(shè)計模式,請求驅(qū)動類型的輕量級Web框架,即使用了MVC架構(gòu)模式的思想,將Web層進行職責解耦?;谡埱篁?qū)動指的就是使用請求-響應(yīng)模型,框架的目的就是幫助我們簡化開發(fā),SpringMVC也是要簡化我們?nèi)粘eb開發(fā)

1、Spring配置類排除加載SpringMVC的bean

SpringMVC 通常只需要加載 controller 包內(nèi)的 bean,而 Spring 需要加載 dao 和 service 包內(nèi)的 bean,為了省事,Spring 配置類經(jīng)常設(shè)置掃描的包為一個大范圍的包(包含 dao 和 service 在內(nèi)的包),此時 Spring 會錯誤或者多余地加載到 controller 包內(nèi)的 bean

使 Spring 排除加載 SpringMVC 的 bean 一般有兩種方法

  • 方法 1:掃描包時精確掃描需要的包,而不用大范圍的掃描
  • 方法 2:大范圍掃描,但是將不需要的 bean 過濾掉

方法 1 示例:

@Configuration
// 使 Spring 只掃描 dao 與 service 包
@ComponentScan({"com.mzz.dao", "com.mzz.service"})
public class SpringConfig {
}

方法 2:在 @ComponentScan 注解中可以設(shè)置 excludeFilters 屬性排除掉 不需要的 bean,excludeFilters 屬性的值是一個 Filter 注解,這個注解也在 ComponentScan 內(nèi),需要設(shè)置 type(過濾類型) 和 classes

下面的示例表示 Spring 的掃描范圍為 com.mzz 但是按注解類型過濾掉所有注解了 @Controller 的 bean

@Configuration
@ComponentScan(value = "com.mzz",
    excludeFilters = @ComponentScan.Filter(
            type = FilterType.ANNOTATION,   // 按照 注解 來進行過濾
            classes = {Controller.class}    // 過濾所有注解了 @Controller 的 bean
    )
)
public class SpringConfig {
}

由于 Filter 注解中 type 的默認值就是 FilterType.ANNOTATION,所以上面的代碼可以簡寫成這樣:

@Configuration
@ComponentScan(value = "com.mzz",
    excludeFilters = @ComponentScan.Filter({Controller.class})
)
public class SpringConfig {
}

[補充]

當 Spring 和 SpringMVC 的配置類同時存在時,上述的方法二可能不會生效,原因是 Spring 進行大范圍掃描時可以掃描到 SpringMVC 的配置類,于是 SpringMVC 中的 bean 也被加載到 Spring 中

此時也有兩種解決方法

一是將 SpringMVC 的配置類移動到 Spring 掃描不到的包下(比如 com 包下)

二是 Spring 過濾時也將 SpringMVC 的配置類過濾掉,SpringMVC 的配置類會注解 @Configuration 和 @ComponentScan,可以對其進行過濾

@Configuration
@ComponentScan(value = "com.mzz",
        excludeFilters = @ComponentScan.Filter({Controller.class, ComponentScan.class})
)
public class SpringConfig {
}

2、Servlet容器配置類簡潔開發(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 返回即可,而不需要手動創(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實現(xiàn)加載控制方法詳解的文章就介紹到這了,更多相關(guān)SpringMVC bean加載控制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

襄垣县| 阿荣旗| 克山县| 甘南县| 仙桃市| 方城县| 航空| 综艺| 贵南县| 海伦市| 临泽县| 垣曲县| 新丰县| 双牌县| 内乡县| 山阴县| 化州市| 新巴尔虎右旗| 新源县| 双牌县| 宁晋县| 鲁山县| 明光市| 岳池县| 搜索| 永新县| 周至县| 寿光市| 内江市| 宽城| 扶余县| 始兴县| 奉节县| 子洲县| 黄大仙区| 遂川县| 遂溪县| 广东省| 连城县| 揭东县| 万盛区|