1. @RequiredArgsConstructor
的作用
-
功能:
@RequiredArgsConstructor
自动生成只包含final
修饰字段的构造函数。-
示例:
@Service @RequiredArgsConstructor public class UserService { private final IUserService userService; }
-
等价于手动写:
public UserService(IUserService userService) { this.userService = userService; }
-
-
依赖注入的作用:
- Spring 自动通过构造函数注入依赖,而
final
保证字段不可变。
- Spring 自动通过构造函数注入依赖,而
-
为什么需要
final
修饰字段?-
不可变性:确保依赖在实例创建时初始化后不能被修改。
-
强制初始化:如果字段是
final
,构造函数必须对其赋值,避免遗漏。-
示例:
private final IUserService userService;
Spring 容器会自动将 Bean 注入到构造函数参数中完成赋值。
-
-
2. @Autowired
与构造函数注入
-
@Autowired
的底层会自动调用构造函数,将 Bean 注入到参数中:public UserService(IUserService userService) { this.userService = userService; }
-
Spring 会将
userService
Bean 自动注入到构造函数中,无需手动实例化。 -
是否需要注解:
- 在类有一个构造函数时,
@Autowired
可以省略,Spring 会默认使用该构造函数。
- 在类有一个构造函数时,
3. Bean 自动注入的范围
-
Spring 支持自动注入以下范围的参数:
-
构造函数的参数(推荐)。
-
@Bean
方法的参数:@Bean public UserService userService(IUserService userService) { return new UserService(userService); }
-
非构造函数的其他方法的参数不支持自动注入。
-
4. 无参构造函数的生成
-
如果类使用了
@Data
,但没有显式定义无参构造函数,需要注意以下问题:-
@Builder
的影响:- 使用
@Builder
时,不会自动生成无参构造函数。
- 使用
-
解决办法:
-
显式添加
@NoArgsConstructor
注解:@NoArgsConstructor @Builder @Data public class User { private Long id; }
-
-
5. 字段为什么可以用方法引用?
-
方法引用的功能:
- 方法引用不仅可以调用方法,也能作为字段的标识。
- 在 MyBatis-Plus 中,
User::getId
会被解析为字段名id
。 - 底层通过反射解析方法名
getId
为id
。
-
Lambda 的使用场景:
-
Lambda 表达式或方法引用通常用于动态构建查询条件。
new LambdaQueryWrapper<User>() .select(User::getId, User::getUsername) .like(User::getUsername, "o");
-
6. 构造函数注入的好处
- 与字段注入的对比:
- 构造函数注入:
- 更加安全,确保依赖注入在对象创建时完成。
- 有助于单元测试,因为可以手动传入依赖。
- 字段注入:
- 直接将依赖注入到字段上,代码简洁,但依赖对象可能未初始化,存在 NPE 风险。
- 构造函数注入:
- 总结: 构造函数注入更符合面向对象设计的原则,推荐在项目中使用。
7. ew
的含义
-
在 MyBatis-Plus 的自定义 SQL 中,
ew
是默认的查询条件参数名称,表示entity wrapper
。-
示例:
SELECT * FROM tb_user ${ew.customSqlSegment}
-
如果不使用默认名称
ew
,可以在注解中手动指定:@Select("SELECT * FROM tb_user ${wrapper.customSqlSegment}") List<User> selectAll(@Param("wrapper") Wrapper<User> wrapper);
-
8. balance
的含义
- 基础意义:
balance
原意是“平衡”。 - 财务领域:
- 表示“账户余额”或“剩余金额”,例如银行账户或电子钱包中的资金。
9. 其他注意点
- 为什么使用雪花算法时 ID 会递增?
- 雪花算法生成的 ID 是基于时间戳的趋势递增值,因此 ID 具有唯一性且呈现递增。
AUTO
和ASSIGN_ID
的区别:AUTO
:数据库负责生成自增 ID。ASSIGN_ID
:使用 MyBatis-Plus 提供的雪花算法生成唯一 ID。