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; // 不可变,安全
}