gpt4 book ai didi

java - Spring Autowiring "forgot"关于依赖

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:00:28 24 4
gpt4 key购买 nike

我想尝试不同类型的 bean 作用域。所以我写了一个测试环境,它应该生成一个随机数,这样我就可以看到一个 bean 是否发生了变化。我的测试设置不起作用,我无法解释我发现了什么。

我正在使用 Spring Boot 2.13 和 Spring Framework 5.15。

以下设置:

主类:

package domain.webcreator;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class WebcreatorApplication {

public static void main(String[] args) {
SpringApplication.run(WebcreatorApplication.class, args);
}
}

bean 类:

package domain.webcreator;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Random;

@Configuration
public class Beans {
@Bean
public Random randomGenerator() {
return new Random();
}
}

作用域类:

package domain.webcreator;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

import java.util.Random;

@Service
@Scope("singleton")
public class Scoper {
private Random rand;

public Scoper(Random rand) {
this.rand = rand;
}

public int getNumber(int max) {
return rand.nextInt(max);
}
}

索引 Controller

package domain.webcreator.controller;

import domain.webcreator.Scoper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class IndexController {
@GetMapping("/")
@ResponseBody
@Autowired
public String indexAction(Scoper scoper) {
return String.valueOf(scoper.getNumber(50));
}
}

我的问题是,我在调用 scoper.getNumber(50) 时收到 NPE。这很奇怪,因为在调试时,会生成一个 Random bean 并将其传递给作用域构造函数。稍后,在 Controller 中,rand 属性为空。 Debugging into Scoper bean creation Debugging into Index controller, inspecting created Scoper bean

我做错了什么?

最佳答案

您正在尝试将 @Autowired 应用于随机方法,这不是 Spring 的工作方式。 Controller 方法参数用于特定于该 HTTP 请求的信息,而不是一般依赖项,因此 Spring 试图创建一个与请求关联的新 Scoper——但它没有任何传入值在填写请求中。(我真的很惊讶你没有收到关于没有默认构造函数的错误。)

相反,在构造函数中传递您的 Scoper

@RestController
public class IndexController {
private final Scoper scoper;

public IndexController(Scoper scoper) {
this.scoper = scoper;
}

@GetMapping("/")
public String indexAction(Scoper scoper) {
return String.valueOf(scoper.getNumber(50));
}
}

一些注意事项:

  • 单例作用域是默认的,无需指定。
  • @RestController 比重复 @ResponseBody 更可取,除非您有混合 Controller 类。

关于java - Spring Autowiring "forgot"关于依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55200986/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com