Spring Boot实战:深入理解@Service与@Mapper注解
注解后,Spring容器会自动扫描并创建该类的一个实例(即Bean),这样我们就可以在其他地方通过自动装配(Autowired)的方式注入这个Bean。注解用于标记接口,使得接口可以被MyBatis扫描到并生成对应的代理实现类。这样,MyBatis会为这个接口生成一个实现类,我们可以在服务类中注入这个映射器接口来调用数据库操作。注解,这意味着Spring容器会管理它的生命周期,并且我们可以在其他地
1. @Service
注解
@Service
是Spring框架提供的一个注解,用于标记类为业务逻辑层的组件。当类上标注了@Service
注解后,Spring容器会自动扫描并创建该类的一个实例(即Bean),这样我们就可以在其他地方通过自动装配(Autowired)的方式注入这个Bean。
示例代码:
假设我们有一个用户服务类UserService
,它包含了一些与用户相关的业务逻辑方法。
import org.springframework.stereotype.Service;
@Service
public class UserService {
// 假设有一个userRepository用于数据库操作
private final UserRepository userRepository;
// 通过构造器注入UserRepository
public 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
注解。
更多推荐
所有评论(0)