[英]How is the Service recognized in the controller
我有一个 controller,它在 Spring 启动时提供服务。
Controller是这样的:
@Controller
@SessionAttributes("name")
public class TodoController {
private TodoService todoService;
public TodoController(TodoService todoService) {
super();
this.todoService = todoService;
}
@RequestMapping("list-todos")
public String showTodos(ModelMap model){
List<Todo> todos = todoService.findByUsername("Gerald");
model.addAttribute("todos", todos);
return "todoList";
}
还有这样的服务
@Service
public class TodoService {
private static List<Todo> todos = new ArrayList<>();
static {
Todo todo1 = new Todo(1, "Gerald", "Learn Java", LocalDate.now().plusYears(1), false);
Todo todo2 = new Todo(2, "Gerald", "Learn Python", LocalDate.now().plusYears(2), false);
Todo todo3 = new Todo(2, "Gerald", "Learn OCaml", LocalDate.now().plusYears(3), false);
Todo todo4 = new Todo(2, "Gerald", "Learn Cooking", LocalDate.now().plusYears(4), false);
System.out.println(todo1);
todos.add(new Todo(1, "Gerald", "Learn Java", LocalDate.now().plusYears(1), false));
todos.add(new Todo(2, "Gerald", "Learn Python", LocalDate.now().plusYears(2), false));
todos.add(new Todo(3, "Gerald", "Learn Handstand", LocalDate.now().plusYears(3), false));
todos.add(new Todo(4, "Gerald", "Learn Cooking", LocalDate.now().plusYears(4), false));
}
public List<Todo> findByUsername(String name){
return todos;
}
public void addTodo(Todo todo){
todos.add(todo);
}
}
如果在 Controller 我有
@RequestMapping("list-todos")
public String showTodos(ModelMap model){
List<Todo> todos = this.todoService.findByUsername("Gerald");
model.addAttribute("todos", todos);
return "todoList";
}
为什么它也有效而不是我在那里:
List<Todo> todos = todoService.findByUsername("Gerald");
换句话说,controller 在没有this
之前如何知道那个上下文中的 todoService 是什么?
如果本地scope中没有这个名字的变量,但是有一个字段,编译器会自己加上this
关键字。
备注:您应该了解 java 核心,因为 spring 做了很多复杂的事情,如果不了解 java,您可能会感到困惑。
如果表达式名称由单个Identifier组成,则在 scope 中标识符出现的位置必须恰好有一个声明表示局部变量、形式参数、异常参数或字段。 ...
因此,我们可以在没有this
的情况下访问实例字段(只要没有与局部变量或参数的名称冲突,那么this
需要用它来区分局部变量/参数和实例字段)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.