【问题标题】:Springboot @GetMapping method injection with object as parameterSpringboot @GetMapping 方法注入以对象为参数
【发布时间】:2021-09-13 21:01:25
【问题描述】:

我是 Spring Boot 的新手。据我了解构造函数注入是如何工作的,那么我不知道为什么 HelloController 工作 - index 方法不是构造函数,那么在哪里/为什么创建 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!");
    }
}

【问题讨论】:

    标签: spring-boot dependency-injection get-mapping


    【解决方案1】:

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

    简单地说,Spring 足够聪明,当你用适当的注解标记类时,他会处理剩下的事情:)

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

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

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

    【讨论】:

      【解决方案2】:

      这是一个有趣的问题 - 只是因为你提出的方式。通过注入,您是指创建一个单例类(您将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 类进行了另一项更改:

      @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. 控制器方法未传递弹簧管理对象的实例

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-08
        • 1970-01-01
        • 2014-12-20
        • 2016-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多