为什么自动接线作为现场单调组件与方法中的自动接线不同

Why autowired as field singletone component is not the same as autowired in method

提问人:NiL007 提问时间:11/8/2023 最后编辑:NiL007 更新时间:11/8/2023 访问量:37

问:

我遇到了一个奇怪的问题。我有一个简单的组件(单音)

@Component
public class SingletonExample {
    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

和 RestController

public class RestController {
    @Autowired
    SingletonExample example;

    @Autowired
    SingletonExample example2;

    @GetMapping("/get_single")
    public String getHash2(@Autowired SingletonExample example3) {
        example.setValue("ABC");
        String value1 = String.format("example hashcode = %s Value = %s", example.hashCode(), example.getValue());
        String value2 = String.format("example2 hashcode = %s Value = %s", example2.hashCode(), example2.getValue());
        String value3 = String.format("example3 hashcode = %s Value = %s", example3.hashCode(), example3.getValue());
        return value1.concat("<br>").concat(value2).concat("<br>").concat(value3);
    }
}

结果

example hashcode = 1063350459 Value = ABC (okay)

example2 hashcode = 1063350459 Value = ABC (okay)

example3 hashcode = 750544796 Value = null (???)

我预计 example、example2 和 example3 必须是同一个对象。但实际上我看到只有 example 和 example2(作为 Field 注入)是相同的,但 example3(注入在方法中)有另一个哈希码和值。在行之后,example.setValue(“ABC”) example3 仍然具有 value=null,并且哈希码与 exaple 和 example2 不同。为什么 example3 是另一个对象?

Spring Dependency-Injection Autowired (弹簧依赖注入自动连线)

评论

1赞 M. Deinum 11/8/2023
由于请求处理程序方法不支持,因此每次都会创建一个新实例。@AUtowired

答:

1赞 DingHao 11/8/2023 #1

如 Autowired java 文档中所述

自动接线参数

尽管从 Spring Framework 5.0 开始,从技术上讲可以在单个方法或构造函数参数上声明@Autowired,但框架的大多数部分都忽略了此类声明。核心 Spring Framework 中唯一主动支持 autowired 参数的部分是 spring-test 模块中的 JUnit Jupiter 支持(有关详细信息,请参阅 TestContext 框架参考文档)。

评论

0赞 NiL007 11/8/2023
谢谢 M. Deinum 和 DingHao。这是我的错误。我在我的团队领导代码中看到了“相同”的例子。但我没有注意到他在构造函数(!)中使用了这样的语法,而不是在方法中使用了这种语法(正如我所想的那样)。现在一切都清楚了。感谢您提供有关 Spring 5 的更多详细信息。