【发布时间】:2020-07-29 22:18:25
【问题描述】:
我已经开始学习spring了,对此我有点困惑: 如果我创建一个 spring @Controller 或 @RestController 然后在方法中我要求不同的参数,我注意到即使没有将它们声明为 bean 或组件,spring 也会自动填充这些参数。
所以在我的项目中,我有一个 Movie 类(一个简单的 POJO),我也需要一个 RestTemplate 的单例实例。第一种方法是声明 RestTemplate bean,然后使用 @Autowired 请求它,这工作正常。之后,我注释掉了那部分代码并将 RestTemplate 和 Movie 作为我的方法的参数,即使我没有任何 bean 声明,spring 也会自动为我提供这些实例。
我认为 spring 利用 bean 声明来进行依赖注入,所以我的问题是,如果 spring 已经在方法中注入了我想要的任何东西,为什么我必须声明 bean 并使用 @Autowired? spring 是否注入这些参数的单例实例?这可以使用还是更好地贴花豆并通过@Autowired?
类下:
这是我的电影模型:
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
public class Movie {
private String movieId;
private String name;
}
这是我的休息控制器:
@RestController
@RequestMapping("/catalog")
public class MovieCatalogController {
//@Autowired
//private RestTemplate restTemplate;
@RequestMapping("/{userId}")
public List<Catalog> getCatalog(@PathVariable("userId") String userId, RestTemplate restTemplate, Movie movie){
// todo
return new ArrayList<>();
}
}
以及主要的spring boot应用类:
@SpringBootApplication
public class MovieCatalogServiceApplication {
//@Bean
//public RestTemplate getRestTemplate() {
//return new RestTemplate();
//}
public static void main(String[] args) {
SpringApplication.run(MovieCatalogServiceApplication.class, args);
}
}
谢谢
【问题讨论】:
-
它不会注入到方法中,它实际上会创建一个新的
RestTEmplate,而不是使用上下文中的那个。这也是 Spring MVC 特有的,因为它将构造它现在没有的对象并将它们用作模型属性并将请求中的参数绑定到它。您应该做的是在您的类中自动装配它(并且当您使用 Spring Boot 时,您不需要将RestTemplate定义为 Spring Boot 自动提供的 bean)。 -
感谢您的回复 Deinum。所以这不是 DI 案例,而是 spring mvc 模型对象的行为,对吗?对于 RestTemplate bean,如果我删除 bean 定义,它会给我一个错误:“需要一个无法找到的 'org.springframework.web.client.RestTemplate' 类型的 bean。”
-
这确实不是 DI 案例,而是 Spring MVC 行为。关于错误,这很奇怪,如果您使用 Spring Boot(正确!)它会提供一个。
标签: java spring spring-boot spring-mvc