gpt4 book ai didi

Spring Javaconfig bean间依赖关系

转载 作者:IT老高 更新时间:2023-10-28 13:57:44 25 4
gpt4 key购买 nike

浏览 Spring Javaconfig 引用文档 http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/beans.html我发现了一些令人困惑的部分......

"5.12.4 使用 @Configuration 注释" 部分下它说:

“当@Beans 相互依赖时,表达这种依赖就像让一个bean 方法调用另一个bean 方法一样简单:

@Configuration
public class AppConfig {
@Bean
public Foo foo() {
return new Foo(bar());
}
@Bean
public Bar bar() {
return new Bar();
}
}

在上面的示例中,foo bean 通过构造函数注入(inject)接收到对 bar 的引用。”

好吧,如果一切都是无状态的,那可能并不重要,但如果你有上面的配置,然后在你的应用程序中做:

@Autowired 
private Foo foo;

@Autowired
private Bar bar;

检查 bean 的 hashCodes,事实证明,您的私有(private)变量 bar 将引用 Bar不同实例,而不是foo 使用的一个,这可能不是你所期望的,对吧?

我想说正常的模式应该是:

@Configuration
public class AppConfig {
@Bean
public Bar bar() {
return new Bar();
}
@Autowired Bar bar;
@Bean
public Foo foo() {
return new Foo(bar);
}
}

现在,当您在应用中 Autowiring 两个 bean 时,您只会创建一个 Bar 实例。

我是否遗漏了什么,或者我是否纠正了这里的文档有问题?

然后,再往下,在 “有关基于 Java 的配置如何在内部工作的更多信息”部分下看起来他们试图“澄清”这个问题:

@Configuration
public class AppConfig {
@Bean
public ClientService clientService1() {
ClientServiceImpl clientService = new ClientServiceImpl();
clientService.setClientDao(clientDao());
return clientService;
}
@Bean
public ClientService clientService2() {
ClientServiceImpl clientService = new ClientServiceImpl();
clientService.setClientDao(clientDao());
return clientService;
}
@Bean
public ClientDao clientDao() {
return new ClientDaoImpl();
}
}

现在,不幸的是,这个配置甚至不会在运行时加载,因为有 2 个相同类型的 bean,ClientService,没有区分属性,所以得到异常

org.springframework.beans.factory.NoUniqueBeanDefinitionException: 
No qualifying bean of type [.....] is defined:
expected single matching bean but found 2

但即使我们稍微改变示例,并给前 2 个 bean 不同的类型,

@Bean
public ClientService1 clientService1() {...clientDao()...}
@Bean
public ClientService2 clientService2() {...clientDao()...}
@Bean
public ClientDao clientDao() {
return new ClientDaoImpl();
}

这仍然是不正确的,因为——与文本声称的相反——我们仍然会创建 3 个不同的 ClientDaoImpl 实例, Autowiring 所有 3 个 bean 时。

再说一次,我是完全遗漏了什么,还是文档真的像我认为的那样糟糕?

编辑:添加了一个演示我看到的问题:

https://github.com/rop49/demo

一个 bean ServiceA,以及构造函数注入(inject) ServiceA 的两个 bean ServiceB1ServiceB2

然后是两个测试类 Config01TestConfig02Test,除了配置之外,它们是相同的。第一次测试通过,第二次因为唯一性断言而失败。

最佳答案

检查您的配置类上是否有 @Configuration 注释。在您的演示中,至少 Config01Config02 类中缺少它们。如果我将它们添加到这些类中,则测试通过。

关于Spring Javaconfig bean间依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25943116/

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