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

Spring Boot实战:深入理解@Service与@Mapper注解

1. @Service 注解

@Service 是Spring框架提供的一个注解,用于标记类为业务逻辑层的组件。当类上标注了@Service注解后,Spring容器会自动扫描并创建该类的一个实例(即Bean),这样我们就可以在其他地方通过自动装配(Autowired)的方式注入这个Bean。

示例代码:

假设我们有一个用户服务类UserService,它包含了一些与用户相关的业务逻辑方法。

import org.springframework.stereotype.Service;@Service
public class UserService {// 假设有一个userRepository用于数据库操作private final UserRepository userRepository;// 通过构造器注入UserRepositorypublic UserService(UserRepository userRepository) {this.userRepository = userRepository;}public User findUserById(Long id) {return userRepository.findById(id).orElseThrow(() -> new UserNotFoundException("User with id " + id + " not found"));}// 其他业务逻辑方法...
}

在上面的代码中,UserService类上标注了@Service注解,这意味着Spring容器会管理它的生命周期,并且我们可以在其他地方通过@Autowired来注入这个服务。

2. @Mapper 注解(通常与MyBatis一起使用)

@Mapper注解通常不是Spring框架的一部分,而是MyBatis框架提供的。在Spring Boot项目中,如果集成了MyBatis,那么@Mapper注解用于标记接口,使得接口可以被MyBatis扫描到并生成对应的代理实现类。这样我们就可以通过这个接口来调用数据库的操作。

示例代码:

假设我们有一个用户映射器接口UserMapper,它定义了与数据库交互的方法。

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.Optional;@Mapper
public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{id}")Optional<User> findById(Long id);// 其他数据库操作方法...
}

在上面的代码中,UserMapper接口上标注了@Mapper注解,并且方法上使用了MyBatis提供的注解如@Select来定义SQL查询。这样,MyBatis会为这个接口生成一个实现类,我们可以在服务类中注入这个映射器接口来调用数据库操作。

注意:在某些配置中,如果你已经在启动类或配置类上使用了@MapperScan注解来指定扫描的包路径,那么映射器接口上的@Mapper注解可以省略。例如:

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.example.demo.mapper") // 指定扫描的包路径
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

在这个例子中,所有位于com.example.demo.mapper包下的接口都会被MyBatis扫描并处理,无需在每个接口上单独使用@Mapper注解。

http://www.lryc.cn/news/275095.html

相关文章:

  • 【DevOps-06】Jenkins实现CI/CD操作
  • 华为面经总结
  • 大模型实战营Day1 书生·浦语大模型全链路开源体系
  • Java 集合面试题真实场景还原
  • AutoSAR(基础入门篇)4.9-Autoar_BSW小结
  • Winform中使用Websocket4Net实现Websocket客户端并定时存储接收数据到SQLite中
  • Jenkins修改全局maven配置后不生效解决办法、以及任务读取不同的settings.xml文件配置
  • 【elfboard linux开发板】7.i2C工具应用与aht20温湿度寄存器读取
  • LeetCode-有效的字母异位词(242)
  • 【AIGC-图片生成视频系列-6】SSR-Encoder:用于主题驱动生成的通用编码器
  • [C]jupyter中使用C
  • 探讨一下WebINFO 下的一些思考
  • MySQL中的开发基于Python的SQL工具类操作数据库简单示例
  • 安卓Android Studio读写FM1208CPU卡源码
  • 二、Redis的特性与应用场景
  • 编程笔记 html5cssjs 019 HTML实体
  • 数据结构:树详解
  • list1.Sort((m, n) => m.Id - n.Id); id是double类型的为什么回报错
  • GoLang vs Python
  • Hello 2024(A~D,F1)
  • Python+Torch+FasterCNN网络目标检测识别
  • v8 pwn利用合集
  • JVM:字节码
  • 常见网络设备及功能详解
  • Python教程(20)——python面向对象编程基本概念
  • C# Winform教程(一):MD5加密
  • Mongodb使用指定索引删除数据
  • 虾皮怎么选品:虾皮(Shopee)跨境电商业务成功的关键步骤
  • QML —— 使用Qt虚拟键盘示例(附完整源码)
  • Nacos 持久化及集群的搭建【微服务】