当前位置: 首页 > news >正文

springboot入门-service层构造器注入原理

在 Spring Boot 中,通过构造器注入的方式将 Repository(JPA)或 Mapper(MyBatis)注入到 Service 层的原理及示例如下:


1. 构造器注入的原理

  • 依赖注入(DI)机制
    Spring 容器在创建 Bean 时,会检查类的构造函数,自动将所需的依赖(其他 Bean)传入构造函数参数中。
  • 不可变性与安全性
    构造器注入通常与 final 字段结合,确保依赖项在对象创建后不可变,避免空指针异常和线程安全问题。
  • 自动装配
    Spring 4.3+ 支持隐式构造函数注入,若类只有一个构造函数,可省略 @Autowired 注解。

2. 注入 JPA Repository 的示例

(1) 定义 JPA Repository
// UserRepository.java(继承 JpaRepository)
public interface UserRepository extends JpaRepository<User, Long> {User findByEmail(String email);
}
(2) Service 类(构造器注入)
@Service
public class UserService {private final UserRepository userRepository;// 构造器注入(Spring 自动注入 UserRepository)public UserService(UserRepository userRepository) {this.userRepository = userRepository;}public User getUserByEmail(String email) {return userRepository.findByEmail(email);}
}

关键点

  • Spring Data JPA 会自动生成 UserRepository 的实现类并注册为 Bean。
  • 构造器参数 UserRepository 会被 Spring 自动匹配并注入。

3. 注入 MyBatis Mapper 的示例

(1) 定义 MyBatis Mapper
// UserMapper.java(使用 @Mapper 注解)
@Mapper
public interface UserMapper {@Select("SELECT * FROM user WHERE id = #{id}")User findById(Long id);
}
(2) Service 类(构造器注入)
@Service
public class UserService {private final UserMapper userMapper;// 构造器注入(Spring 自动注入 UserMapper)public UserService(UserMapper userMapper) {this.userMapper = userMapper;}public User getUserById(Long id) {return userMapper.findById(id);}
}

关键点

  • 需确保 MyBatis Mapper 被扫描为 Bean(通过 @Mapper@MapperScan)。
  • application.yml 中配置 MyBatis 映射文件路径:
    mybatis:mapper-locations: classpath:mapper/*.xml
    

4. 使用 Lombok 简化代码

若项目中引入 Lombok,可用 @RequiredArgsConstructor 自动生成构造函数:

(1) JPA Repository 注入
@Service
@RequiredArgsConstructor
public class UserService {private final UserRepository userRepository;public User getUserByEmail(String email) {return userRepository.findByEmail(email);}
}
(2) MyBatis Mapper 注入
@Service
@RequiredArgsConstructor
public class UserService {private final UserMapper userMapper;public User getUserById(Long id) {return userMapper.findById(id);}
}

Lombok 作用

  • @RequiredArgsConstructor 会为所有 final 字段生成构造函数,减少样板代码。

5. 原理总结

步骤说明
1. Bean 注册Repository(JPA)或 Mapper(MyBatis)需注册为 Spring Bean。
2. 构造函数匹配Spring 根据构造函数参数类型匹配已注册的 Bean。
3. 依赖注入Spring 容器创建 Service Bean 时,自动将依赖的 Bean 传入构造函数。
4. 不可变性使用 final 字段确保依赖项不可变,避免后续修改。

6. 常见问题

(1) 多个构造函数如何处理?

若类有多个构造函数,需用 @Autowired 明确指定注入哪一个:

@Service
public class UserService {private final UserRepository userRepository;@Autowired  // 显式标记需要注入的构造函数public UserService(UserRepository userRepository) {this.userRepository = userRepository;}
}
(2) 依赖冲突怎么办?

若存在多个相同类型的 Bean,需用 @Qualifier 指定名称:

public UserService(@Qualifier("userRepositoryImpl") UserRepository userRepository) {this.userRepository = userRepository;
}

总结

通过构造器注入 Repository 或 Mapper,是 Spring Boot 中最安全、最推荐的依赖注入方式。其核心原理是 Spring 容器自动匹配构造函数参数类型并注入 Bean,结合 final 字段确保依赖项的不可变性。无论是 JPA 还是 MyBatis,只需遵循以下步骤:

  1. 定义依赖接口(Repository 或 Mapper)。
  2. 声明构造器参数并赋值给 final 字段。
  3. Spring 自动注入依赖的 Bean。

相关文章:

  • 数据库设置外键的作用
  • CMCC RAX3000M CH EC 算力版刷机(中国移动 RAX3000M 算力版)刷机
  • 汉诺塔用python编写
  • leetcode刷题日记——基本计算器
  • QML Date:日期处理示例
  • MIL、SIL、HIL与Back-to-Back测试详解:从模型到硬件的完整验证链
  • python怎么查看函数原型及变量是什么类型
  • [SystemVerilog] Clocking
  • 2软考系统架构设计师:第一章系统架构概述 - 练习题附答案及超详细解析
  • 基于libdxfrw库读取样条曲线并离散为点
  • DHCP配置文件详解
  • FreeRTOS事件标志组详解:高效的任务间通知机制
  • 区分PROJECT_SOURCE_DIR, CMAKE_SOURCE_DIR,CMAKE_CURRENT_SOURCE_DIR
  • windows下查看idea运行的进程占的JVM情况工具
  • Agent2Agent
  • 校平机:金属板材加工的核心设备
  • x86系列CPU寄存器和汇编指令总结
  • Kettle学习
  • VSCode远程登录云服务器并设置免密登录全攻略
  • LeetCode --- 446 周赛
  • 上海:5月8日起5年以上首套个人住房公积金贷款利率下调至2.6%
  • 马克思主义理论研究教学名师系列访谈|鲍金:给予学生一碗水、自己就要有一桶水
  • 金融监管总局将推出8项增量政策:涉房地产金融、险资入市、稳外贸等
  • 大学2025丨专访清华教授沈阳:建议年轻人每天投入4小时以上与AI互动
  • 丁薛祥在学习《习近平经济文选》第一卷专题研讨班上强调:深入学习贯彻习近平经济思想,加强党中央对经济工作的集中统一领导
  • 黎巴嫩9年来首次举行地方选举