java - Java 中的 Spring 配置 - 创建和使用 2 个相同类的 bean 不使用 Autowired

标签 java xml spring configuration javabeans

我知道之前已经回答了如何创建和使用两个相同类型的 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/

相关文章:

java - 如何为单个引擎实例设置 java-8 Nashorn javascript 引擎选项

c# - 为什么面试官要问高级问题?

xml - lxml.etree 将元素插入 element.text

xml - 查询 linq 到 xml

java - 使用密码输入时的Edittext字段不隐藏密码

java - 从第一次 RMI 调用服务器起的固定时间后通知所有客户端

java - 查找连通分量的高效算法

spring - 在 Grails 中使用 AOP 不适用于服务

java - @Component 的 Autowiring HashMap

javascript - org.springframework.web.bind.MissingServletRequestParameterException : Required Long parameter 'userId' is not present"错误