以对象为参数的Springboot @GetMapping方法注入

Springboot @GetMapping method injection with object as parameter

我是 Spring Boot 新手。据我了解构造函数注入是如何工作的,然后我不知道为什么 HelloController 有效 - index 方法不是构造函数所以 where/why cat 对象实例创建了吗?很高兴得到一些关于它的文档或文章。

HelloController.java

@RestController
public class HelloController {
    @GetMapping("/{name}")
    public String index(@PathVariable("name") String name, Cat cat){
        cat.setName(name);
        return "<b>Hello " + cat.getName() + "</b>";
    }
}

Cat.java

@Component
public class Cat {
    @Getter @Setter
    private String name;

    public Cat(){
        System.out.println("Created new Cat!");
    }
}

Bean 是由 Spring 上下文管理的对象。这些 classes 的对象不需要创建 - Spring 负责创建。开发人员可以指出可以部署此类对象的位置。此操作称为“依赖注入”。

简单地说,Spring 足够聪明,当你用适当的注释标记 class 时,他会处理其余的:)

关于此主题的文章很多,只需使用 google“如何在 Spring 中创建对象”。

在 Spring 中,可以通过多种方式定义 bean,方法是:通过使用注释,在配置方法中指定它们的实例 class,使用 XML配置。

创建bean 有很多注解。每个人都有自己的命运。最流行的注解包括:Component, Service, Repository, Controller / RestController

这是一个有趣的问题 - 只是因为你提出问题的方式。通过注入,你的意思是创建一个单例class(你有Cat标记为@Component)?好吧,为了回答这个问题,我在您的 print 声明中添加了一些额外内容:

    public Cat(){
        System.out.println("Created new Cat! with hasCode: " + hashCode());
    }

你看,hashCode 不应该为同一个对象改变。结果不是很意外:

Created new Cat! with hasCode: 362563829
Created new Cat! with hasCode: 782885695

应用程序启动时打印第一行。这是预期的,因为 bean 是在 singleton 的范围内创建的,并且该过程在应用程序完全加载之前完成。当我向端点发出请求时出现第二个输出,在这种情况下,Spring 创建了一个 Cat 的实例并将其作为参数传递给 @GetMapping。您获得与您的请求一样多的 Cat 对象。 同样,如果我从 Cat 中删除 @Component,则第一行不会显示。 继续前进,我对 RestController class:

进行了另一个更改
@RestController
public class HelloController {

    @Autowired
    private Cat myCat;

    @GetMapping("/{name}")
    public String index(@PathVariable("name") String name, Cat cat){
        cat.setName(name);
        System.out.println("Hello " + myCat.hashCode());
        return "Hello " + cat.getName() + "The age is: " + cat.getAge();
    }
}

这是 运行 这个应用程序的结果:

它表明传递给控制器​​方法的猫与 Spring 容器管理的猫不同。

脑震荡

  1. 每次调用 Rest 控制器方法时都会传递一个 class 的新实例。
  2. 控制器方法未传递 spring 托管对象的实例

N.B.:我还没有真正看到任何官方文档说明上述发现。不过会很高兴看到一个