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.info() - 一般信息
- 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;
}
}
总结
- @Slf4j:Lombok 注解,自动生成日志对象,简化日志代码
- @RequestMapping:Spring MVC 注解,映射请求路径到处理方法
- @Autowired vs @Resource:
- @Autowired 默认按类型注入,Spring 推荐
- @Resource 默认按名称注入,JDK 标准
- 两者功能相似,但注入策略不同