SpringMVC bean实现加载控制方法详解

目录
  • 1、Spring配置类排除加载SpringMVC的bean
  • 2、Servlet容器配置类简洁开发

1、Spring配置类排除加载SpringMVC的bean

SpringMVC 通常只需要加载 controller 包内的 bean,而 Spring 需要加载 dao 和 service 包内的 bean,为了省事,Spring 配置类经常设置扫描的包为一个大范围的包(包含 dao 和 service 在内的包),此时 Spring 会错误或者多余地加载到 controller 包内的 bean

使 Spring 排除加载 SpringMVC 的 bean 一般有两种方法

  • 方法 1:扫描包时精确扫描需要的包,而不用大范围的扫描
  • 方法 2:大范围扫描,但是将不需要的 bean 过滤掉

方法 1 示例:

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

方法 2:在 @ComponentScan 注解中可以设置 excludeFilters 属性排除掉 不需要的 bean,excludeFilters 属性的值是一个 Filter 注解,这个注解也在 ComponentScan 内,需要设置 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容器配置类简洁开发

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 返回即可,而不需要手动创建 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[]{"/"};
    }
}

视频链接:传送门

到此这篇关于SpringMVC bean实现加载控制方法详解的文章就介绍到这了,更多相关SpringMVC bean加载控制内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringMVC中使用bean来接收form表单提交的参数时的注意点

    这是前辈们对于SpringMVC接收表单数据记录下来的总结经验: SpringMVC接收页面表单参数 springmvc请求参数获取的几种方法 下面是我自己在使用时发现的,前辈们没有记录的细节和注意点: 使用bean来接收form表单提交的参数时,pojo中必须含有默认的(即空的)构造函数,同时,需要设置到bean中的变量必须有setter方法. 注:以下代码均为示例代码,非本人实际运行代码,请自行补充. 例如:我有一个bean类是User,具有变量username和password.同时,表单

  • springmvc path请求映射到bean 方法的流程

    一.加载注册流程 1.在dispatch-servlet.xml中配置< mvc:annotation-driven/>,在控制器的方法上加入@RequestMapping注解即可. 2.mvc:annotation-driven的解析流程 会调用到自定义元素解析器的AnnotationDrivenBeanDefinitionParser.parse方法. 3.org.springframework.web.servlet.mvc.method.annotation.RequestMappin

  • SpringMVC bean实现加载控制方法详解

    目录 1.Spring配置类排除加载SpringMVC的bean 2.Servlet容器配置类简洁开发 1.Spring配置类排除加载SpringMVC的bean SpringMVC 通常只需要加载 controller 包内的 bean,而 Spring 需要加载 dao 和 service 包内的 bean,为了省事,Spring 配置类经常设置扫描的包为一个大范围的包(包含 dao 和 service 在内的包),此时 Spring 会错误或者多余地加载到 controller 包内的 b

  • Springboot常用注解及配置文件加载顺序详解

    Springboot常用注解及底层实现 1.@SpringBootApplication:这个注解标识了一个SpringBoot工程,她实际上是另外三个注解的组合,分别是: @SpringBootConfiguration:源码可以看到,这个注解除了元注解外,实际就只有一个@Configuration,把该类变成一个配置类,表示启动类也是一个配置类: @EnableAutoConfiguration:是开启自动配置的功能,向Spring容器中导入了一个Selector,用来加载ClassPath

  • Spring Cloud Alibaba Nacos Config加载配置详解流程

    目录 1.加载节点 2.NacosPropertySourceLocator的注册 3.加载 3.1.加载share 3.2.加载extention 3.3.加载主配置文件 1.加载节点 SpringBoot启动时,会执行这个方法:SpringApplication#run,这个方法中会调prepareContext来准备上下文,这个方法中调用了applyInitializers方法来执行实现了ApplicationContextInitializer接口的类的initialize方法.其中包括

  • SpringBoot使用Shiro实现动态加载权限详解流程

    目录 一.序章 二.SpringBoot集成Shiro 1.引入相关maven依赖 2.自定义Realm 3.Shiro配置类 三.shiro动态加载权限处理方法 四.shiro中自定义角色与权限过滤器 1.自定义uri权限过滤器 zqPerms 2.自定义角色权限过滤器 zqRoles 3.自定义token过滤器 五.项目中会用到的一些工具类常量等 1.Shiro工具类 2.Redis常量类 3.Spring上下文工具类 六.案例demo源码 一.序章 基本环境 spring-boot 2.1

  • SpringIOC BeanDefinition的加载流程详解

    目录 一.前言 二. BeanDefinition 的体系 2.1 体系概览 2.2 BeanDefinition 的作用 三. BeanDefinition 的载入 3.1 载入的入口 3.2 保存的逻辑 3.3 使用的方式 总结 一.前言 这一篇来看看 SpringIOC 里面的一个细节点 , 来简单看看 BeanDefinition 这个对象 , 以及有没有办法对其进行定制. CASE 备份 :  gitee.com/antblack/ca… 二. BeanDefinition 的体系 2

  • classloader类加载器_基于java类的加载方式详解

    基础概念 Classloader 类加载器,用来加载 Java 类到 Java 虚拟机中.与普通程序不同的是.Java程序(class文件)并不是本地的可执行程序.当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader. JVM本身包含了一个ClassLoader称为Bootstrap ClassLoader,和JVM一样,BootstrapClassLoader是用本地代码实现

  • Android LayoutInflater加载布局详解及实例代码

    Android  LayoutInflater加载布局详解 对于有一定Android开发经验的同学来说,一定使用过LayoutInflater.inflater()来加载布局文件,但并不一定去深究过它的原理,比如 1.LayoutInflater为什么可以加载layout文件? 2.加载layout文件之后,又是怎么变成供我们使用的View的? 3.我们定义View的时候,如果需要在布局中使用,则必须实现带AttributeSet参数的构造方法,这又是为什么呢? 既然在这篇文章提出来,那说明这三

  • jquery ajax局部加载方法详解(实现代码)

    在jquery中实现ajax加载的方法有很多种,不像以前的js的ajax只有那一种,下面我们介绍jquery ajax实现局部加载方法总结,有需要了解的朋友可参考. 例 $.ajax({ url: "hotelQuery!queryHotelByCity.action", type: "post", dataType: "html", data: "queryHotel.city="+cityobj.value+"&

  • 基于js文件加载优化(详解)

    在js引擎部分,我们可以了解到,当渲染引擎解析到script标签时,会将控制权给JS引擎,如果script加载的是外部资源,则需要等待下载完后才能执行. 所以,在这里,我们可以对其进行很多优化工作. 放置在BODY底部 为了让渲染引擎能够及早的将DOM树给渲染出来,我们需要将script放在body的底部,让页面尽早脱离白屏的现象,即会提早触发DOMContentLoaded事件. 但是由于在IOS Safari, Android browser以及IOS webview里面即使你把js脚本放到

  • Python自动重新加载模块详解(autoreload module)

    守护进程模式 使用python开发后台服务程序的时候,每次修改代码之后都需要重启服务才能生效比较麻烦. 看了一下Python开源的Web框架(Django.Flask等)都有自己的自动加载模块功能(autoreload.py),都是通过subprocess模式创建子进程,主进程作为守护进程,子进程中一个线程负责检测文件是否发生变化,如果发生变化则退出,主进程检查子进程的退出码(exist code)如果与约定的退出码一致,则重新启动一个子进程继续工作. 自动重新加载模块代码如下: autorel

随机推荐