当前位置: 首页 > 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。
http://www.xdnf.cn/news/152281.html

相关文章:

  • 推荐系统FM模型
  • 2025.4.26_STM32_SPI
  • 29、简要描述三层架构开发模式以及三层架构有哪些好处?
  • Vue3中AbortController取消请求的用法详解
  • Log4j Properties 配置项详细说明
  • 如何判断你的PyTorch是GPU版还是CPU版?
  • 4.23-4.26学习总结 HTML—CSS常见标签和样式
  • 实验四 进程调度实验
  • Adriuno:编程语言基础
  • 使用 Truffle 和 Ganache 搭建本地以太坊开发环境并部署一个简单智能合约
  • [mysql]约束(上)
  • 使用 Frida 绕过 iOS 应用程序中的越狱检测
  • 自动化测试实战篇
  • 【Web应用服务器_Tomcat】二、Tomcat 核心配置与集群搭建
  • 关于Code_流苏:商务合作、产品开发、计算机科普、自媒体运营,一起见证科技与艺术的交融!
  • Kettle学习
  • 利器善其事:软件开发工具管理之道
  • Sam算法基本原理解析
  • 基于大模型对先天性幽门肥厚性狭窄预测及临床方案的研究报告
  • MH2103 MH22D3系列的JTAG/SWD复用功能和引脚映射,IO初始化的关键点
  • C#中常见的设计模式
  • 第十六届蓝桥杯网安初赛wp
  • 关于flink两阶段提交高并发下程序卡住问题
  • 2025.04.26-美团春招笔试题-第四题
  • 设计看似完美却测不过? Intra-Pair Skew 是「讯号完整性(Signal Integrity)」里最隐形的杀手
  • 【C】初阶数据结构12 -- 冒泡排序
  • 买币永续合约成全球交易热点,XBIT去中心化交易所平台显著提升市场流动性
  • 联想笔记本电脑在Windows下通过联想驱动实现风扇控制
  • 从像素到驾驶决策:Python与OpenCV赋能自动驾驶图像识别
  • django之账号管理功能