簡體   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