ryo*_*ska 2 java xml configuration spring javabeans
我知道如何创建和使用两个相同类型的 Spring bean 的问题之前已经回答过,我已经阅读了一些关于 @Qualifier 和 @Resource 的内容,但我看到的所有答案都在上下文中的自动装配。在我的情况下,我尝试使用 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);
}
...
Run Code Online (Sandbox Code Playgroud)
另一个 spring 配置 xml 文件导入到 application-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>
Run Code Online (Sandbox Code Playgroud)
当我这样做时,尝试在 Java 配置文件中创建 MyConnectionManager 时出错。错误在构造函数 arg 上,具有以下信息 ) org.springframework.beans.factory.UnsatisfiedDependencyException ..(预期单个 bean 但发现 2: MyAuthProvider, buildMyConnectionManager())
我还在这里看到了另一个 bean,它引用了 AuthProvider 类,但它不只是将它指定为 bean 构造函数的参数,而是使用无参数构造函数并使用“buildAuthProvider()”方法创建一个新的 AuthProvider。我没有看到任何关于那个或在 xml 文件中创建的 bean 的抱怨,但我不确定这个错误是否只是掩盖了其他错误。
有人可以帮我弄清楚如何拥有这两个独立的豆子吗?它们是通过传递给构造函数的不同值创建的,因此在这种情况下我不能重用相同的 bean。
小智 5
当使用多个相同类型的 bean 时,您需要用名称来限定它们。在 XML 配置中,这很自然地带有name=""属性。在基于 Java 的配置中,您需要将名称添加到注释中,@Bean(name = "")。
接下来,您可以从 Spring Context 中的任何位置引用 bean。在 Java 中,您将使用@Qualifier批注,该批注在声明 Java bean 或使用@Autowired批注注入 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
}
}
Run Code Online (Sandbox Code Playgroud)
请注意@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>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6843 次 |
最近记录: |