Spring Boot,@ EnableWebMvc和常见用例

事实证明,Spring Boot与标准Spring MVC @EnableWebMvc不能很好地融合@EnableWebMvc 。 添加注释时发生的事情是禁用了Spring Boot自动配置。

不好的部分(浪费了我几个小时)是,在任何指南中,您都找不到明确指出的内容。 在本指南中,它说Spring Boot是自动添加它的,但是没有说如果您按照以前的经验并仅添加注释会发生什么。

实际上,由于这种自动禁用的自动配置而出现问题的人们正试图以各种方式解决该问题。 最常见的是-保留@EnableWebMvc,同时扩展Spring Boot的WebMvcAutoConfiguration 。 就像这里这里这里 有些 。 在我有了主意并以这种方式实施后,我找到了他们。 然后,在通过Spring Boot的代码并看到autoconfiguration类中的内部类具有一行Javadoc声明之后,意识到这样做是多余的

配置等同于{@code @EnableWebMvc}。

这就回答了我的问题,即Spring启动自动配置是否缺少某些EnableWebMvc“功能”。 他们扩展提供EnableWebMvc的类,而不是镜像功能(这很明显,我想),这是很好的。

要自定义bean时应该怎么做? 与往常一样,扩展WebMvcConfigurerAdapter (使用@Component注释新类)并进行自定义。

因此,特定问题的底线是:不要在Spring Boot中使用@EnableWebMvc,只需将spring-web作为maven / gradle依赖项包括在内,它将被自动配置。

这里的大图使我在主配置类中添加了一条注释,详细说明了为什么不应将@EnableWebMvc放在此处。 因此,自动配置魔术为我节省了很多工作,但我仍然添加了一行以解释为什么不存在某些内容。

那是由于常见的用例 -人们习惯了使用@EnableWebMvc 。 因此,最自然,最常见的做法是添加它,尤其是在您不知道Spring Boot自动配置如何详细工作的情况下。 而且他们会继续这样做,并浪费了几个小时才意识到自己应该删除它(或者在扩展一堆启动类以达到相同效果之前)。

在这种情况下,我的建议是:记录警告。 并要求明确禁用自动配置以摆脱警告。 我必须打开调试以查看自动配置的内容,然后探索一堆类以检查必要条件以弄清楚情况。

Spring Boot的主要用例之一是jar打包的Web应用程序。 我猜这就是大多数教程的目的,而这正是它最常用于的目的。 因此,对于这种常见用例应该有特殊的对待-附加的日志和日志信息可以帮助人们度过自动配置的迷宫。

我不想被看作是“指导” Spring团队,他们在拥有良好的文档和简单的行为方面做得非常出色。 但是在这种情况下,多个子项目“碰撞”,似乎可以改进。

翻译自: https://www.javacodegeeks.com/2017/04/spring-boot-enablewebmvc-common-use-cases.html

Sprint Boot 是一个基于 Spring 框架的快速初始化框架,它简化了微服务和RESTful API的开发过程。在 Spring Data JPA 中,`@Cacheable` 和 `@CacheEvict` 是两个注解,用于缓存管理和数据更新操作。 `@Cacheable` 用于标记方法,表示如果某个方法的结果不在缓存中,Spring Data 会先尝试从数据库查询,然后将结果放入缓存供后续请求直接使用,提高性能。例如: ```java @GetMapping("/users/{id}") @Cacheable("users") public User getUser(@PathVariable Long id) { return userRepository.findById(id); } ``` 测试用例示例: 1. **正常获取缓存中的数据**: 首次调用该方法时,因为缓存未填充,会执行数据库查询并将结果存入缓存。 - 测试:第一次请求,应从数据库查找到用户并返回。 - 验证:缓存中存在该用户的ID对应的User对象。 2. **从数据库查询新数据并更新缓存**: 缓存过期或者不存在的情况下,再次调用。 - 测试:第二次请求(或缓存过期后),方法应执行数据库查询,并将结果更新到缓存。 - 验证:第二次请求返回的用户数据与第一次相同,且缓存中有新的数据。 `@CacheEvict` 则用于在特定条件下从缓存中移除数据,比如方法执行后,需要确保相关数据从缓存中清除。例如: ```java @PostMapping("/updateUser") @CacheEvict(value = "users", key = "#user.id") public void updateUser(User user) { userRepository.save(user); } ``` 测试用例: 1. **更新数据库并清除缓存**: 更新用户后,验证方法是否正确执行缓存蒸发操作。 - 测试:更新用户,确保方法执行后数据库更新了。 - 验证:再次查询同一用户,发现缓存中的数据已被清除。 2. **确认缓存中不再有旧数据**: 使用相同的用户ID再次调用查询方法。 - 测试:查询被更新后的用户,预期从缓存中找不到。 - 验证:返回的用户数据为更新后的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值