当前位置: 首页 > news >正文

Spring MVC中的Controller加载控制与Bean加载控制详解

    Spring MVC默认通过父子容器实现Web层与非Web组件的隔离。但在实际项目中,若未明确控制组件的扫描路径与加载规则,表现层的Controller、业务层的Service与数据层的Repository往往会被“一刀切”地扫描到同一上下文中。例如,业务层的Service被意外注册到Spring MVC的Web上下文中,或数据源DataSource等基础设施Bean被表现层的组件直接依赖。这种混乱的加载方式不仅可能破坏分层架构的纯净性,还会导致事务管理失效、依赖注入冲突,甚至引发性能隐患。

加载控制

关键点:

在标准的 Spring MVC 应用中,存在 两个独立的上下文

上下文类型加载方式典型组件Bean 可见性
根上下文 (Root)ContextLoaderListenerService、Repository、DataSource对 Web 上下文可见
Web 上下文 (Servlet)DispatcherServletController、Interceptor、ViewResolver仅 Web 上下文内部可见
  • 父子关系:Web 上下文是根上下文的子上下文,因此 Web 上下文可以访问根上下文的 Bean,但根上下文无法访问 Web 上下文的 Bean。

  • 隔离性:若未正确分层,Web 上下文将无法获取业务层组件。

方案一:精确扫描

@Configuration
@ComponentScan("com.cc.controller")
public class SpringMvcConfig {
}

 方案二:过滤

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

@Configuration
@ComponentScan(
        value = "com.cc" ,     //明确扫描哪个包 value同等于basePackage
        excludeFilters = @ComponentScan.Filter(    //表示排除哪些包
                type = FilterType.ANNOTATION,
                classes = Controller.class
        ),
        includeFilters = @ComponentScan.Filter(    //表示精确扫描哪些包
                type = FilterType.ANNOTATION,
                classes = {Service.class, Repository.class}
        )
)
public class SpringConfig {
}

测试:首先将spriongMvcConfig中的注解注释,仅让SpringConfig生效。写一个测试类看是否能获取UserController(在扫描SpringConfig时排除了Controller注解(见上面的代码),所以不能获取到):

import com.cc.config.SpringConfig;
import com.cc.controller.UserController;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class App {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext a = new AnnotationConfigApplicationContext(SpringConfig.class);
        System.out.println(a.getBean(UserController.class));
        
    }
}

    接着回到SpringConfig,将排除的部分注释,如果能获取到则说明该方法可行:

简化开发 

    回到servlet容器,在springmvc环境和pring加载不同的配置:

public class ServletConfig extends AbstractDispatcherServletInitializer {

    //加载springmvc容器配置
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext app = new AnnotationConfigWebApplicationContext();
        app.register(SpringMvcConfig.class);
        return app;
    }

    //设置哪些请求归属springMVC处理
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};  //所有请求
    }

    //加载spring容器配置
    @Override
    protected WebApplicationContext createRootApplicationContext() {
        AnnotationConfigWebApplicationContext app = new AnnotationConfigWebApplicationContext();
        app.register(SpringConfig.class);
        return app;
    }
}

    该方法可以从继承AbstractDispatcherServletInitializer换继承AbstractAnnotationConfigDispatcherServletInitializer:

public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer {


    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

相关文章:

  • 日夜间模式切换
  • 批量删除多个 Excel 文件中的宏
  • 【计算机网络】深入解析 HTTP 请求中的 header 类型:Cookie 的概念、特点和应用场景:登录和用户认证
  • 人工智能技术篇*卷(二)
  • 《Python实战进阶》No20: 网络爬虫开发:Scrapy框架详解
  • ROS实践一构建Gazebo机器人模型文件urdf
  • Ateme在云端构建可扩展视频流播平台
  • 英语-新概念-第四册
  • SSL VXN
  • React:类组件(中)
  • Visual stdio2022 opencv cude pytroch与yolov8/可视化工具的环境搭建,不搞VIP,我也要当雷锋
  • thinkphp+mysql+cast解决text类型字段的文本型数字排序错误的方法 - 数据库文本字段排序ASC、DESC的失效问题
  • Unity知识总结——算法
  • 【大模型】如何为你的RAG选择Embedding模型--MMTEB引领RAG系统变革
  • 78_Pandasagg()和aggregate()的用法
  • Qt状态更新设计
  • uniapp+Vue3 开发小程序的下载文件功能
  • QT系列教程(14) QT 按键事件
  • 【sentry】sentry报错信息转发常用办公聊天工具
  • 嵌入式工控机在汽车制造中的卓越表现
  • 品牌网球拍有哪些/优化网络培训
  • 可靠的政府网站建设企业/百度推广官网首页
  • 建筑规范网站/抖音广告
  • 代理加盟微信网站建设/2024年重大新闻简短
  • 城乡建设网站职业查询系统/做网站优化哪家公司好
  • 安全培训网站/西安网站seo诊断