Spring MVC 深度剖析:优势与劣势全面解读

news2024/11/30 1:27:32

文章目录

      • Spring MVC 优势
        • 1. **松耦合**
        • 2. **易于测试**
        • 3. **灵活性**
        • 4. **强大的配置机制**
        • 5. **异常处理**
        • 6. **国际化支持**
        • 7. **数据验证**
        • 8. **安全性**
        • 9. **性能优化**
      • Spring MVC 劣势
        • 1. **学习曲线**
        • 2. **配置复杂性**
        • 3. **性能开销**
        • 4. **视图技术限制**
        • 5. **社区和支持**

Spring MVC 优势

1. 松耦合
  • 依赖注入(DI)

    • 自动装配:Spring 容器通过 @Autowired 注解自动装配依赖,减少了手动创建对象的代码量,提高了代码的可维护性和可测试性。
    • 接口编程:鼓励使用接口编程,使得组件之间的依赖关系更加灵活和可替换,增强了模块化设计。
    • 生命周期管理:Spring 容器管理 bean 的生命周期,包括初始化、销毁等,确保了资源的有效管理和释放。
  • 示例代码

    @Service
    public class UserService {
        @Autowired
        private UserRepository userRepository;
        
        public User getUserById(Long id) {
            return userRepository.findById(id).orElse(null);
        }
    }
    
    @Controller
    public class UserController {
        @Autowired
        private UserService userService;
        
        @GetMapping("/users/{id}")
        public String getUser(@PathVariable Long id, Model model) {
            User user = userService.getUserById(id);
            model.addAttribute("user", user);
            return "user";
        }
    }
    
2. 易于测试
  • 单元测试

    • MockMvc:Spring 提供了 MockMvc 类,用于模拟 HTTP 请求和响应,方便进行控制器的单元测试。
    • Spring TestContext Framework:提供了丰富的测试支持,包括事务管理、数据库初始化等,使得测试更加高效和全面。
  • 示例代码

    @RunWith(SpringRunner.class)
    @WebMvcTest(UserController.class)
    public class UserControllerTest {
        @Autowired
        private MockMvc mockMvc;
        
        @MockBean
        private UserService userService;
        
        @Test
        public void testGetUser() throws Exception {
            User user = new User(1L, "John Doe", "john@example.com");
            when(userService.getUserById(1L)).thenReturn(user);
            
            mockMvc.perform(get("/users/1"))
                   .andExpect(status().isOk())
                   .andExpect(view().name("user"))
                   .andExpect(model().attribute("user", user));
        }
    }
    
3. 灵活性
  • 视图技术多样

    • JSP:传统的视图技术,适合简单的 Web 应用。
    • Thymeleaf:现代的模板引擎,支持静态原型和动态内容的混合,提供了丰富的表达式语言。
    • FreeMarker:功能强大的模板引擎,适合复杂的页面生成,提供了灵活的模板语法。
  • 配置方式多样

    • 注解配置:使用注解(如 @Controller@RequestMapping)进行配置,简洁易懂,减少了 XML 配置文件的冗余。
    • XML 配置:对于复杂的配置需求,可以使用 XML 配置文件进行详细设置,提供了更多的灵活性。
4. 强大的配置机制
  • 注解驱动

    • @Controller:标记控制器类,使其被 Spring 容器管理。
    • @RequestMapping:指定请求映射规则,支持路径、方法、参数等多种匹配方式。
    • @GetMapping@PostMapping:简化常见的 HTTP 方法映射,提高了代码的可读性。
  • XML 配置

    • 扫描组件:使用 <context:component-scan> 扫描指定包下的组件,自动注册到 Spring 容器。
    • 启用 MVC 注解驱动:使用 <mvc:annotation-driven> 启用 MVC 注解支持,简化配置。
    • 视图解析器:配置视图解析器,如 InternalResourceViewResolver,将逻辑视图名称解析为具体的视图对象。
  • 示例代码

    @Configuration
    @ComponentScan(basePackages = "com.example")
    @EnableWebMvc
    public class WebConfig implements WebMvcConfigurer {
        @Bean
        public InternalResourceViewResolver viewResolver() {
            InternalResourceViewResolver resolver = new InternalResourceViewResolver();
            resolver.setPrefix("/WEB-INF/views/");
            resolver.setSuffix(".jsp");
            return resolver;
        }
    }
    
5. 异常处理
  • 全局异常处理

    • @ControllerAdvice:定义全局异常处理器,集中处理多个控制器的异常。
    • @ExceptionHandler:处理特定类型的异常,提供统一的错误响应。
  • 示例代码

    @ControllerAdvice
    public class GlobalExceptionHandler {
        @ExceptionHandler(ResourceNotFoundException.class)
        @ResponseStatus(HttpStatus.NOT_FOUND)
        public ModelAndView handleResourceNotFoundException(ResourceNotFoundException ex) {
            ModelAndView modelAndView = new ModelAndView("error");
            modelAndView.addObject("errorMessage", ex.getMessage());
            return modelAndView;
        }
    }
    
6. 国际化支持
  • 多语言支持

    • MessageSource:用于加载多语言资源文件,支持动态获取国际化消息。
    • LocaleResolver:解析用户的语言偏好,支持多种语言环境的切换。
    • LocaleChangeInterceptor:拦截请求,动态切换语言,提供个性化的用户体验。
  • 示例代码

    @Bean
    public MessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasename("messages");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }
    
    @Bean
    public LocaleResolver localeResolver() {
        CookieLocaleResolver resolver = new CookieLocaleResolver();
        resolver.setDefaultLocale(Locale.US);
        resolver.setCookieName("locale");
        resolver.setCookieMaxAge(3600);
        return resolver;
    }
    
    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() {
        LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
        interceptor.setParamName("lang");
        return interceptor;
    }
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeChangeInterceptor());
    }
    
7. 数据验证
  • JSR-303 标准

    • Hibernate Validator:常用的验证框架,支持多种验证注解,如 @NotNull@Size@Email 等。
    • @Valid@Validated:用于触发验证,确保输入数据的有效性。
    • BindingResult:捕获验证结果,提供详细的错误信息。
  • 示例代码

    @PostMapping("/users")
    public String createUser(@Valid @ModelAttribute User user, BindingResult result, Model model) {
        if (result.hasErrors()) {
            return "userForm";
        }
        userService.saveUser(user);
        model.addAttribute("message", "User created successfully");
        return "success";
    }
    
8. 安全性
  • Spring Security 集成

    • 认证:用户身份验证,支持多种认证机制,如表单登录、HTTP 基本认证等。
    • 授权:访问控制,支持基于角色的访问控制(RBAC)、方法级别的安全控制等。
    • CSRF 保护:防止跨站请求伪造攻击,保护用户免受恶意攻击。
  • 示例代码

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                    .antMatchers("/", "/home").permitAll()
                    .anyRequest().authenticated()
                .and()
                .formLogin()
                    .loginPage("/login")
                    .permitAll()
                .and()
                .logout()
                    .permitAll();
        }
    
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.inMemoryAuthentication()
                .withUser("user").password("{noop}password").roles("USER")
                .and()
                .withUser("admin").password("{noop}admin").roles("ADMIN");
        }
    }
    
9. 性能优化
  • 缓存支持

    • Spring Cache:支持多种缓存提供者,如 EhCache、Redis,提供了声明式的缓存管理。
    • @Cacheable@CachePut@CacheEvict:用于控制缓存操作,提高数据访问速度。
  • 异步处理

    • @Async:标记异步方法,支持后台任务的执行。
    • CompletableFuture:用于异步编程,提供了丰富的异步操作方法。
  • 示例代码

    @Configuration
    @EnableCaching
    public class CacheConfig {
        @Bean
        public CacheManager cacheManager() {
            return new ConcurrentMapCacheManager("users");
        }
    }
    
    @Service
    public class UserService {
        @Cacheable("users")
        public User getUserById(Long id) {
            // 模拟耗时操作
            Thread.sleep(1000);
            return userRepository.findById(id).orElse(null);
        }
    }
    
    @Service
    public class AsyncService {
        @Async
        public CompletableFuture<User> getUserAsync(Long id) {
            return CompletableFuture.supplyAsync(() -> userService.getUserById(id));
        }
    }
    

Spring MVC 劣势

1. 学习曲线
  • 初学者友好度
    • 概念复杂:Spring MVC 涉及的概念和技术较多,初学者需要时间来理解和掌握,特别是依赖注入、AOP、事务管理等高级特性。
    • 文档复杂:官方文档内容丰富但较为复杂,新手可能需要较长时间来消化和理解,特别是对于没有 Java Web 开发经验的开发者。
2. 配置复杂性
  • 配置繁琐
    • 大量配置:对于大型项目,需要编写大量的配置代码,尤其是在使用 XML 配置时,配置文件可能变得庞大且难以维护。
    • 依赖管理:需要手动管理多个依赖库,增加了项目的复杂度,尤其是在没有使用构建工具(如 Maven 或 Gradle)的情况下。
3. 性能开销
  • 初始化开销

    • 启动时间:Spring MVC 在启动时会初始化大量的组件和服务,可能会导致应用启动时间较长,尤其是在配置复杂的项目中。
    • 内存占用:大量的依赖注入和代理机制可能会增加内存占用,影响应用的性能。
  • 运行时开销

    • 反射和代理:Spring 框架广泛使用反射和代理机制,虽然提供了强大的功能,但也可能引入一定的运行时开销,特别是在高并发场景下。
4. 视图技术限制
  • 视图技术选择
    • 技术多样性:虽然支持多种视图技术,但在某些情况下,特定的视图技术可能不够成熟或存在性能问题,例如某些模板引擎的渲染速度较慢。
    • 模板引擎兼容性:不同模板引擎之间可能存在兼容性问题,需要额外的工作来解决,尤其是在多团队协作的情况下。
5. 社区和支持
  • 社区活跃度
    • 问题解答:虽然 Spring 社区非常活跃,但某些特定问题可能需要较长时间才能得到解答,特别是在处理边缘情况或高级特性时。
    • 第三方库支持:一些第三方库可能没有及时更新以支持最新的 Spring 版本,导致兼容性问题,特别是在企业级应用中使用时。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2250115.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Goland或Idea启动报错

Goland或Idea启动不了 报错如图&#xff1a; 原因&#xff1a;破解导致 解决方案 环境变量中有关Goland的全部删除

麒麟系统x86安装达梦数据库

一、安装准备前工作 操作系统&#xff1a;银河麒麟V10&#xff0c;CPU&#xff1a; x86_64 架构 下载地址&#xff0c;麒麟官网&#xff1a;https://www.kylinos.cn/ 数据库&#xff1a;dm8_20220915_x86_kylin10_64 下载地址&#xff0c;达梦数据库官网&#xff1a;https://…

(0基础保姆教程)-JavaEE开课啦!--11课程(初识Spring MVC + Vue2.0 + Mybatis)-实验9

一、什么是Spring MVC&#xff1f; Spring MVC 是一个基于 Java 的 Web 框架&#xff0c;遵循 MVC 设计模式&#xff0c;用于构建企业级应用程序。它通过控制器(Controller)处理用户请求&#xff0c;模型(Model)处理业务逻辑&#xff0c;视图(View)展示数据&#xff0c;实现了请…

NLP信息抽取大总结:三大任务(带Prompt模板)

信息抽取大总结 1.NLP的信息抽取的本质&#xff1f;2.信息抽取三大任务&#xff1f;3.开放域VS限定域4.信息抽取三大范式&#xff1f;范式一&#xff1a;基于自定义规则抽取&#xff08;2018年前&#xff09;范式二&#xff1a;基于Bert下游任务建模抽取&#xff08;2018年后&a…

【JavaEE初阶 — 网络编程】TCP流套接字编程

TCP流套接字编程 1. TCP &#xff06; UDP 的区别 TCP 的核心特点是面向字节流&#xff0c;读写数据的基本单位是字节 byte 2 API介绍 2.1 ServerSocket 定义 ServerSocket 是创建 TCP 服务端 Socket 的API。 构造方法 方法签名 方法说明 ServerS…

记录一次 k8s 节点内存不足的排查过程

背景&#xff1a;前端服务一直报404&#xff0c;查看k8s日志&#xff0c;没发现报错&#xff0c;但是发现pods多次重启。 排查过程&#xff1a; 查看pods日志&#xff0c;发现日志进不去。 kubectrl logs -f -n weave pod-name --tail 100查看pod describe kubectl describ…

Java文件遍历那些事

文章目录 一、简要概述二、文件遍历几种实现1. java实现2. Apache common-io3. Spring 三、最终结论 一、简要概述 文件遍历基本上是每个编程语言具备的基本功能&#xff0c;Java语言也不例外。下面我们以java原生实现&#xff0c;Apache common-io、spring框架实现为例来比较…

硬件基础22 反馈放大电路

目录 一、反馈的基本概念与分类 1、什么是反馈 2、直流反馈与交流反馈 3、正反馈与负反馈 4、串联反馈与并联反馈 5、电压反馈与电流反馈 二、负反馈四种组态 1、电压串联负反馈放大电路 2、电压并联负反馈放大电路 3、电流串联负反馈放大电路 4、电流并联负反馈放大…

【JS】React与Vue的异步编程对比:深度解析与实战案例全面指南

文章目录 前言更多实用工具React与Vue概述ReactVue 异步编程基础回调函数PromiseAsync/Await React中的异步编程使用Axios进行数据请求异步操作与组件生命周期React Hooks中的异步处理 Vue中的异步编程使用Axios进行数据请求异步操作与Vue生命周期Vue Composition API中的异步处…

【iOS】知乎日报总结

文章目录 前言首页网络请求轮播图上滑加载图片请求 文章详情页WKWebView的使用点赞、收藏持久化——FMDB的使用 其他问题沙盒问题单元格点击其他 总结 前言 在系统学习了OC语言和UI控件后&#xff0c;知乎日报是第一个比较大的项目&#xff0c;耗时一个多月时间&#xff0c;里面…

算法竞赛(Python)-链表

文章目录 一 链表简介1.1链表定义1.2 双向链表1.3 循环链表 二、链表的基本操作2.1 链表的结构定义2.2 建立一个线性链表2.3 求线性链表的长度2.4 查找元素2.5 插入元素2.5.1 链表头部插入元素2.5.2 链表尾部插入元素2.5.3 链表中间插入元素 2.6 改变元素2.7 删除元素2.7.1 链表…

Unity ShaderLab 实现网格爆炸

实现思路&#xff1a; 沿着3D物体每个面的法线&#xff0c;将面偏移一定的位置。 Shader Graph实现如下&#xff1a; Shader Lab 实现如下&#xff1a; Shader "Unlit/MeshExplode" {Properties{_MainTex ("Texture", 2D) "white" {}_Distan…

快速上手:如何开发一个实用的 Edge 插件

在日常浏览网页时&#xff0c;背景图片能够显著提升网页的视觉体验。如果你也想为自己的浏览器页面添加个性化背景图片&#xff0c;并希望背景图片设置能够持久保存&#xff0c;本文将介绍如何通过开发一个自定义Edge插件来实现这一功能。我们将涵盖保存背景设置到插件选项页&a…

【Maven】功能和核心概念

1. 什么是Maven 1.1 Maven的概念 Maven 是 Apache 软件基金会组织维护的一款自动化构建工具&#xff0c;专注服务于 Java 平台的项目构建和依赖管理。 1.2 为什么要使用Maven&#xff1f; 在项目开发中&#xff0c;我们需要引用各种 jar 包&#xff0c;引用的 jar 包可能有…

神经网络归一化方法总结

在深度学习中&#xff0c;归一化 是提高训练效率和稳定性的关键技术。以下是几种常见的神经网络归一化方法的总结&#xff0c;包括其核心思想、适用场景及优缺点。 四种归一化 特性Batch NormalizationGroup NormalizationLayer NormalizationInstance Normalization计算维度…

视频汇聚平台Liveweb国标GB28181视频平台监控中心设计

在现代安防视频监控领域&#xff0c;Liveweb视频汇聚平台以其卓越的兼容性和灵活的拓展能力&#xff0c;为用户提供了一套全面的解决方案。该平台不仅能够实现视频的远程监控、录像、存储与回放等基础功能&#xff0c;还涵盖了视频转码、视频快照、告警、云台控制、语音对讲以及…

hubu新星杯实践能力赛模拟赛web/Misc-wp

ez_eval <?php highlight_file(__FILE__); error_reporting(0);$hubu $_GET[hubu];eval($hubu);?> 先进行代码审计&#xff0c;GET传参hubu&#xff0c;并执行命令&#xff0c;没有任何绕过&#xff0c;放开手脚去做 payload: ?hubusystem(cat /f*); #直接rcerc…

【前端】跨域问题与缓存

报错如下&#xff1a; 原因&#xff1a; 浏览器 缓存跨域&#xff0c;顾名思义是由于浏览器的缓存机制导致的一种跨域情况。这种跨域一般会出现在浏览器通过一些无视跨域的标签和css(如img、background-image)缓存了一些图片资源之后&#xff0c;当再次发起图片请求时&#xff…

抓包之OSI七层模型以及TCPIP四层模型

写在前面 本文看下OSI七层模型以及TCP/IP四层网络模型&#xff0c;并尝试使用wireshark进行验证。 1&#xff1a;OSI七层网络模型和TCP/IP四层模型 全称&#xff1a;open system interconnection。 需要注意OSI七层模型最终是没有落地的&#xff0c;最终落地的是与之类似的…

#渗透测试#红蓝攻防#HW#漏洞挖掘#漏洞复现02-永恒之蓝漏洞

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…