在不同路径控制器中使用CarService,是否必须用@Resource或@Autowired?
无需@Autowired/@Resource使用CarService的可行方案
Spring确实已经把CarService的实例纳入容器管理了,但控制器要用到这个Bean,还是得通过依赖注入机制,不过确实可以不用显式写@Autowired或@Resource,下面是几种实用的方式:
1. 构造器注入(用Lombok简化)
给你的控制器加上@RequiredArgsConstructor注解,同时把CarService声明为private final成员变量——Lombok会自动帮你生成带这个参数的构造器,而Spring 4.3+版本会自动给只有单个构造器的类注入构造器参数对应的Bean,完全不用写注入注解:
@RestController @RequiredArgsConstructor public class CarController { private final CarService carService; @GetMapping("/cars") public List<Car> getCars() { return carService.list(); } }
这种方式是现在Spring官方推荐的注入方式,既避免了空指针风险,又不用写冗余的注解。
2. 请求方法参数直接注入
如果只是在某个请求处理方法里用到CarService,可以直接把它作为方法参数,Spring会自动注入实例:
@RestController public class CarController { @GetMapping("/cars") public List<Car> getCars(CarService carService) { return carService.list(); } }
不过这种方式只能在当前方法里用这个Bean,控制器的其他方法没法复用,适合简单场景。
避坑提醒
绝对不要直接用new CarServiceImpl()来创建对象——这样生成的实例不在Spring容器里,不仅没法用Spring的事务、AOP等功能,而且如果CarServiceImpl依赖了CarMapper这类容器内的Bean,手动new会直接报错。
内容的提问来源于stack exchange,提问作者stone
相关产品推荐
相关产品推荐

