1

我是 Spring Boot 的新手。当我了解构造函数注入的工作原理时,我不知道为什么会HelloController起作用 -索引方法不是构造函数,所以在哪里/为什么创建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>";
    }
}

猫.java

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

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

2 回答 2

2

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

简而言之,Spring 足够聪明,当您使用适当的注释标记类时,他会处理其余的 :)

有很多关于这个主题的文章只是使用谷歌“如何在 Spring 中创建对象”。

在 Spring 中,可以通过以下几种方式定义 bean:通过使用注解,在配置类的方法中指定它们的实例,使用 XML 配置。

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

于 2021-09-13T21:19:32.387 回答
1

这是一个有趣的问题——只是因为你提出的方式。通过注入,您的意思是创建一个单例类(您已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与你的请求一样多。同样,如果我从中删除@ComponentCat第一行不会出现。继续前进,我对RestController班级进行了另一项更改:

@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 控制器方法时,都会传递一个类的新实例。
  2. 控制器方法不传递弹簧管理对象的实例

注意:我还没有真正遇到任何官方文件说明上述发现。会很高兴看到一个

于 2021-09-13T21:59:22.510 回答