我知道之前已经回答了如何创建和使用两个相同类型的 Spring bean 的问题,并且我已经阅读了一些关于 @Qualifier 和 @Resource 的内容,但是我看到的所有答案都是在 Autowiring 的上下文中。在我的例子中,我尝试使用 bean 的地方在配置文件的另一部分,所以我不确定解决方案的哪些部分适用。我还有一个案例,我们正在以多种方式进行配置(xml 配置文件和带有 @Configuration 注释的 java 文件。代码如下所示
import com.this.that.AuthProvider;
@Configuration
...
@Bean
public AuthProvider buildAuthProvider() {
return new AuthProvider(someotherbean);
}
@Bean
public MyConnectionManager buildMyConnectionManager(AuthProvider authProvider) {
return new MyConnectionManager(authProvider);
}
...
导入到application-config.xml中的另一个spring config xml文件
<bean id="MyAuthProvider" class="com.this.that.AuthProvider">
<constructor-arg type="java.lang.String" ref="somedifferentbean" />
</bean>
<bean id="MyClient" class="com.that.this.MyClient">
<constructor-arg type="com.this.that.AuthProvider"
ref="MyAuthProvider" />
</bean>
当我这样做时,尝试在 Java 配置文件中创建 MyConnectionManager 时出错。错误在构造函数 arg 上,具有以下信息) org.springframework.beans.factory.UnsatisfiedDependencyException ..(期望单个 bean 但发现 2:MyAuthProvider、buildMyConnectionManager())
我在这里还看到另一个引用 AuthProvider 类的 bean,但它不是仅将其指定为 bean 构造函数的参数,而是使用无参数构造函数并使用“buildAuthProvider()”方法创建一个新的 AuthProvider。我没有看到任何关于那个或在 xml 文件中创建的 bean 的提示,但我不确定这个错误是否只是掩盖了其他错误。
有人能帮我弄清楚如何拥有这两个单独的 bean 吗?它们是用传递给构造函数的不同值创建的,因此在这种情况下我不能重复使用同一个 bean。
最佳答案
当使用相同类型的多个 bean 时,您需要用名称限定它们。在 XML 配置中,这很自然地与 name="" 属性一起出现。在基于 Java 的配置中,您需要将名称添加到注释中,@Bean(name = "")。
接下来,您可以从 Spring 上下文中的任何位置引用该 bean。在 Java 中,您将使用 @Qualifier 注释,它在声明 Java bean 或使用 @Autowired 注释注入(inject)到 Spring 托管类中时起作用。
Java 配置示例:
@Configuration
public class ApplicationConfiguration {
/**
* Define bean-one, which can be referenced in Java config or XML config.
* @return
*/
@Bean(name = "bean-one")
public String whoAmI(){
return "bean 1.";
}
/**
* Create a bean with the who am I from the XMl config.
* @param whoAmI
* @return
*/
@Bean(name = "xml-message")
public String xmlMessage(@Qualifier("bean-two") String whoAmI){
return "I am " + whoAmI; // I am bean 2
}
/**
* Define the bean with the who am I from the Java config
* @param whoAmI
* @return
*/
@Bean(name="java-message")
public String javaMessage(@Qualifier("bean-one") String whoAmI){
return "I am " + whoAmI; // I am bean 1
}
}
请注意 @Qualifier 注释的位置,如果不在方法参数前面,它将不起作用。
XML 配置示例:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- Find my other context -->
<context:annotation-config />
<context:component-scan base-package="test.spring"/>
<!-- Declare bean to to be injected into the any of the message objects. -->
<bean class="java.lang.String" name="bean-two">
<constructor-arg value="bean two"/>
</bean>
<!-- Notice that we reference Java config "Bean-One" by using the name assigned -->
<bean class="java.lang.String" name="xml-message-two">
<constructor-arg ref="bean-one"/>
</bean>
<!-- Notice that we reference Java config "Bean-Two" by using the name assigned -->
<bean class="java.lang.String" name="java-message-two">
<constructor-arg ref="bean-two"/>
</bean>
</beans>
关于java - Java 中的 Spring 配置 - 创建和使用 2 个相同类的 bean 不使用 Autowired,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38679927/