Spring Boot控制器中无this调用注入的Service为何可行?
为什么Spring Boot控制器中不用
this也能调用注入的TodoService? 这本质是Java的变量查找规则在起作用,和Spring注入本身无关,具体逻辑如下:
- 构造方法注入完成后,
TodoService实例已经被赋值给TodoController类的实例成员变量todoService,这个变量属于当前控制器对象的一部分。 - 在
showTodos方法内部使用todoService时,Java会先在方法的局部作用域(比如方法内定义的变量)查找是否有同名变量:- 如果找不到同名局部变量,就会自动向上查找当前对象的实例成员变量,也就是Spring注入的那个
todoService,这时候直接写todoService和this.todoService完全等价。 - 如果方法内定义了同名局部变量,直接写
todoService会优先使用局部变量,这时候才需要用this.todoService明确指定调用实例成员变量。
- 如果找不到同名局部变量,就会自动向上查找当前对象的实例成员变量,也就是Spring注入的那个
举个实际代码例子更容易理解:
@Controller public class TodoController { // 实例成员变量,Spring会通过构造方法注入实例 private final TodoService todoService; // 构造方法注入:这里用this是因为参数名和成员变量名相同,必须区分 public TodoController(TodoService todoService) { this.todoService = todoService; } @GetMapping("/todos") public String showTodos(Model model) { // 直接使用todoService,等价于this.todoService List<Todo> todos = todoService.findByUsername("currentUser"); model.addAttribute("todos", todos); return "todo-list"; } }
内容的提问来源于stack exchange,提问作者user5819768
相关产品推荐
相关产品推荐

