2016-07-31 158 views
1

我知道如何创建和使用两个相同类型的Spring bean的问题已经回答过了使用2种豆同一类的,我读过有关一点点@Qualifier和@Resource,但我所看到的所有答案都在自动装配的环境中。在我的情况下,我试图使用这个bean的地方是在配置文件的另一部分,所以我不确定该解决方案的哪些部分适用。我也有一个情况是:我们正在做的以多种方式(XML配置文件,并与@Configuration注释的Java文件的配置,下面的代码是什么样子Spring的配置 - 创建并没有使用自动装配Autowired

import com.this.that.AuthProvider; 
@Configuration 
... 
    @Bean 
    public AuthProvider buildAuthProvider() { 
     return new AuthProvider(someotherbean); 
    } 

    @Bean 
    public MyConnectionManager buildMyConnectionManager(AuthProvider authProvider) { 
     return new MyConnectionManager(authProvider); 
    } 
    ... 

另一个Spring配置XML文件导入进入应用-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,buildMyConnec ())

我也在这里看到另一个bean引用AuthProvider类,但不是只将它指定为bean构造函数的参数,而是使用无参数构造函数并使用'buildAuthProvider()创建一个新的AuthProvider )' 方法。我没有看到任何抱怨,或者在xml文件中创建的bean,但我不确定这个错误是否掩盖了其他人。

有人可以帮助我弄清楚如何有这两个独立的豆?它们是通过传递给它们构造函数的不同值创建的,所以在这种情况下我不能重复使用同一个bean。

回答

4

当使用多个相同类型的bean时,你需要用名字来限定它们。在XML配置中,这非常自然地与name =“”属性。在基于Java的配置中,您需要将名称添加到注释中,@Bean(name =“”)

接下来,你可以在Spring上下文中的任何地方引用这个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 
    } 
} 

请注意@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> 
+0

这样做 - 谢谢! – ryoaska

2

你可以使用限定词来区分这两种豆类。

@Bean 
@Qualifier("myJDBCTemplate") 
public JdbcTemplate jdbcTemplate(DataSource dataSource) { 
    return new JdbcTemplate(dataSource); 
} 

@Autowired 
@Qualifier("myJDBCTemplate") 
private JdbcTemplate jdbcTemplate; 
相关问题