以对象为参数的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 容器管理的猫不同。
脑震荡
- 每次调用 Rest 控制器方法时都会传递一个 class 的新实例。
- 控制器方法未传递 spring 托管对象的实例
N.B.:我还没有真正看到任何官方文档说明上述发现。不过会很高兴看到一个
我是 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 容器管理的猫不同。
脑震荡
- 每次调用 Rest 控制器方法时都会传递一个 class 的新实例。
- 控制器方法未传递 spring 托管对象的实例
N.B.:我还没有真正看到任何官方文档说明上述发现。不过会很高兴看到一个