当前位置: 首页 > 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 周赛
  • 铁路上海站五一假期预计发送446万人次,同比增长8.4%
  • QFII一季度现身超300家公司:持有南京银行市值最高,5家青睐立航科技
  • 航行警告!黄海南部进行实弹射击,禁止驶入
  • 万能险新规落地:保险期限不得低于五年,明确万能险销售“负面清单”
  • 好未来:2025财年收入增长51%,下个财年提高整体盈利能力是首要任务
  • 湖南省郴州市统战部部长黄峥嵘主动交代问题,接受审查调查