Spring Boot 常用注解详解:@Slf4j、@RequestMapping、@Autowired/@Resource 对比

1. @Slf4j 作用

@Slf4j 是 Lombok 提供的注解,用于自动生成日志对象。

作用

  • 自动生成一个名为 log 的静态 final 日志对象(类型为 Logger)
  • 无需手动写 private static final Logger log = LoggerFactory.getLogger(类名.class);

使用示例

不使用 @Slf4j(传统方式):

java 复制代码
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class UserService {
    private static final Logger log = LoggerFactory.getLogger(UserService.class);
    
    public void test() {
        log.info("这是一条日志");
        log.error("错误日志");
    }
}

使用 @Slf4j(简化方式):

java 复制代码
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class UserService{
    public void test(){
        log.info("这是一条日志"); //直接用log,无需手动创建
        log.error("错误日志");
    }
}

日志级别

  • log.trace() - 跟踪信息
  • log.debug() - 调试信息
  • log.warn() - 警告信息
  • log.error() - 错误信息

2. @RequestMapping

@RequestMapping 是 Spring MVC 的注解,用于将请求 URL 映射到控制器方法。

作用

  • 定义请求路径与处理方法的映射关系
  • 可指定请求方法(GET、POST、PUT、DELETE 等)
  • 可指定请求参数、请求头等条件

使用示例

基本用法:

java 复制代码
@Controller
@RequestMapping("/user")
public class userController{
    @RequestMapping("/login")
    public Stirng login{
        return "login";
    }
    @RequestMapping(value="/register",method=RequestMethod.POST)
    public String register{
        return "register";
    }
}

指定请求方法

java 复制代码
@RequestMapping(value = "/info", method = RequestMethod.GET)  // 只接受 GET 请求
public String getInfo() {
    return "info";
}

// 或者使用更简洁的注解
@GetMapping("/info")      // 等同于上面的写法
@PostMapping("/create")   // 等同于 @RequestMapping(method = RequestMethod.POST)
@PutMapping("/update")    // 等同于 @RequestMapping(method = RequestMethod.PUT)
@DeleteMapping("/delete") // 等同于 @RequestMapping(method = RequestMethod.DELETE)

指定请求参数:

java 复制代码
@RequestMapping(value="/search",params="keyword") //必须有keyword参数
public String search(){
    return "result";    
}

常用属性

  • value / path:请求路径
  • method:请求方法(GET、POST 等)
  • params:请求参数条件
  • headers:请求头条件
  • produces:响应内容类型(如 application/json)
  • consumes:请求内容类型

3. @Autowired 和 @Resource 区别

两者都用于依赖注入,但来源、默认策略和使用场景不同。

对比表

特性 @Autowired @Resource
来源 Spring 框架 JDK(JSR-250 标准)
默认注入方式 按类型(byType) 按名称(byName)
找不到时的处理 抛出异常(可用 required=false 避免) 抛出异常
支持 支持 @Qualifier 指定名称 支持 name 属性指定名称
使用场景 Spring 项目推荐 更通用,不依赖 Spring

详细说明

@Autowired(Spring 注解)

默认按类型注入:

java 复制代码
@Service
public class userService{
// Spring 会查找类型为 UserMapper 的 Bean
    @Autowierd
    private UserMapper userMapper;
}

按名称注入(需要配合 @Qualifier):

java 复制代码
@Service 
public class UserService{
    //如果有多个UserMapper实现,需要指定名称
    @Autowired
    @Qualifier("userMapperImpl") //指定Bean名称
    privarte UserMapper userMapper;
}

允许为空(避免启动失败):

java 复制代码
@Autowired(required=false) //如果找不到Bean,不会报错
private UserMapper userMapper;

构造函数注入(推荐方式):

java 复制代码
@Service
public class UserService{
    private final UserMapper userMapper;
    @Autowired //Spring4.3+可以忽略
    public UserService(UserMapper userMapper){
        this.userMapper=userMapper;
    }
}
@Resource(JDK 注解)

默认按名称注入:

java 复制代码
@Service
public class UserService {
    // 先按名称 "userMapper" 查找,找不到再按类型查找
    @Resource
    private UserMapper userMapper;
}

指定名称注入:

java 复制代码
@Service
public class UserService {
    @Resource(name = "userMapperImpl")  // 明确指定 Bean 名称
    private UserMapper userMapper;
}

按类型注入(需要指定 type):

java 复制代码
@Resource(type = UserMapper.class)  // 按类型注入
private UserMapper userMapper;

实际使用建议

推荐使用 @Autowired:

  • Spring 项目
  • 按类型注入更直观
  • 支持构造函数注入(更安全,避免循环依赖)

使用 @Resource:

  • 需要按名称注入
  • 希望代码不依赖 Spring(但实际还是 Spring 容器管理)

最佳实践:

java 复制代码
@Service
public class UserService {
    // 推荐:使用构造函数注入,无需 @Autowired(Spring 4.3+)
    private final UserMapper userMapper;
    private final RedisTemplate<String, Object> redisTemplate;
    
    public UserService(UserMapper userMapper, RedisTemplate<String, Object> redisTemplate) {
        this.userMapper = userMapper;
        this.redisTemplate = redisTemplate;
    }
}

总结

  1. @Slf4j:Lombok 注解,自动生成日志对象,简化日志代码
  2. @RequestMapping:Spring MVC 注解,映射请求路径到处理方法
  3. @Autowired vs @Resource:
  • @Autowired 默认按类型注入,Spring 推荐
  • @Resource 默认按名称注入,JDK 标准
  • 两者功能相似,但注入策略不同
相关推荐
裕晟资质规划13 分钟前
三类涉密资质延续时限差异分析:军工60日与集成印制3个月的边界
java·服务器·前端·网络·安全
念念清晰14 分钟前
000-OpenJDK17 源码构建:MacOS环境(M芯片)
java·后端
Wang's Blog38 分钟前
Java 项目实战: 交友项目 - 百度人脸识别入门案例
java·百度·交友
来福猿43 分钟前
SpringCloud Config 源码分析:配置拉取、刷新与多环境管理
后端·spring·spring cloud
wuminyu1 小时前
JMM学习总结:深入理解happens-before关系
java·linux·c语言·jvm·c++
电商API_180079052471 小时前
反向海淘多币种结算:汇率该在哪个时点被冻结
java·开发语言·数据库·跨境电商·1688 api
古法老登瞎折腾2 小时前
大数据智能运维实战(一):机器和任务数据都有了,如何用 MCP 搭建运维助手?
大数据·运维·spring boot·spring ai·mcp
开开心心就好2 小时前
多份文档怎么批量打印?支持多种格式
java·服务器·开发语言·pdf·ocr·散列表·启发式算法
Pniubi3 小时前
模拟一个充值送token怎么保证幂等?一致性?原子性?
java
企业数字化笔记3 小时前
多租户配额怎么控制?用量口径、并发预留与超额处理的实现方法
java·数据库·spring boot