繁体   English   中英

服务如何在 controller 中得到认可

[英]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,您可能会感到困惑。

JLS,§6.5.6.1:简单类型名称,指出:

如果表达式名称由单个Identifier组成,则在 scope 中标识符出现的位置必须恰好有一个声明表示局部变量、形式参数、异常参数或字段。 ...

因此,我们可以在没有this的情况下访问实例字段(只要没有与局部变量或参数的名称冲突,那么this需要用它来区分局部变量/参数和实例字段)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM