您的位置:首页 > 健康 > 美食 > 上海传媒公司有哪些_建工网官网校_郑州网络推广厂家_seo海外

上海传媒公司有哪些_建工网官网校_郑州网络推广厂家_seo海外

2025/4/27 15:59:54 来源:https://blog.csdn.net/shanzhizi/article/details/147543750  浏览:    关键词:上海传媒公司有哪些_建工网官网校_郑州网络推广厂家_seo海外
上海传媒公司有哪些_建工网官网校_郑州网络推广厂家_seo海外

在 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。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com