SpringBoot那些过时写法
SpringBoot一路2.x升级到了写这个文章时的4.x。从刚接触SpringBoot框架的时候2.x,到宣布不再支持2.x和jdk8,最低支持jdk17,当时还给了我一点小小的震撼,不是说好了你发任你发,我用Java8吗? 但是2.x整个不再支持的情况下还是乖乖升级吧。Spring 团队在加速推进现代化,该废弃的废弃,该移除的移除。下面就简单记录下一些曾经的标准写法到现在的不推荐或者直接移除的用法吧。
代码层
@Autowired 字段注入 → 构造器注入
@Controller
public class UserController {
@Autowired
private UserService userSerive;// 无法加 final,测试难搞
}
这是体验感影响最大的一个,当时学习Spring的时候所有教程都是所有@Autowired当时觉得真的方便极了,面试还有控制反转和依赖注入的八股文😂 现在变成了不推荐的用法,IDEA中现在也会报红提示不再推荐使用。Spring 官方现在只认可两种注入方式:构造器注入和 Setter 注入。字段注入已经不作为正式的 DI 选项了。
@Service
public class UserService {
private final UserMapper userMapper;
// Spring 4.3 起,单一构造器无需 @Autowired
public UserService(UserMapper userMapper) {
this.userMapper = userMapper;
}
}
-
过时原因:字段注入导致 NPE 风险(无法实例化)、对象不可变(
final)被破坏、隐藏类间依赖、单元测试必须启动容器。 -
推荐构造器注入(配合 Lombok
@RequiredArgsConstructor更简洁)。
@RestController
@RequiredArgsConstructor // 生成构造器
public class UserController {
private final UserService userService; // 不可变,安全
}
@Value散落配置→ @ConfigurationProperties
一直觉得@Value这个注解不好用,自从知道了@ConfigurationProperties注解后我是再也不喜欢用它了,特别是微服务项目有人在代码中写N个这玩意看到就火大😤 再加上nacos中的N个配置文件,人都找麻了。
@Service
public class MailService {
@Value("${mail.host}")
private String host;
@Value("${mail.port}")
private int port; // 若配置写错,启动不报错,运行时抛异常
}
-
过时原因:配置散落各处难维护,拼写错误只能运行时发现,无类型安全(如端口转 int 需手动转)。
-
替代方案:
- 使用
@ConfigurationProperties绑定配置前缀,支持校验和 IDE 补全。
java
@ConfigurationProperties(prefix = "app")
@Component
public class AppProperties {
@NotBlank
private String name;
@Min(1) @Max(65535)
private int port;
@NotNull
private int timeout;
// getters / setters
} - 使用