限定符在Spring Boot

时间:2017-04-20 13:24:36

标签: java spring spring-boot spring-java-config

我有两个数据源定义为“datasource1”和“datasource2”(来自依赖项的xml配置)。 因为我没有默认配置JdbcTemplate所以我需要手动完成,我这样做:

1

@Bean
public JdbcOperations jdbcOperations(DataSource datasource1) {
    return new JdbcTemplate(datasource1);
}

2

@Bean
public JdbcOperations jdbcOperations(@Qualifier("datasource1") DataSource datasource1) {
    return new JdbcTemplate(datasource1);
}

在这两种情况下都失败了:

Parameter 0 of method jdbcOperations in com.example.PersistentConfig required a single bean, but 2 were found:
    - datasource1: defined in class path resource [datasources.xml]
    - datasource2: defined in class path resource [datasources.xml]

为什么限定符不起作用?

我无法更改datasources.xml文件以将primary=true添加到datasource

datasources.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.xsd
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="datasource1"
          class="com.example.database.IdentifiedLazyConnectionDataSourceProxy">
        <qualifier value="datasource1"/>
        <property name="targetDataSource">
            <bean class="org.springframework.jndi.JndiObjectFactoryBean">
                <property name="jndiName" value="java:comp/env/ak1Database"/>
                <property name="resourceRef" value="true"/>
            </bean>
        </property>
        <property name="identifier" value="shared"/>
    </bean>

    <bean id="datasource2"
          class="com.example.database.IdentifiedLazyConnectionDataSourceProxy">
        <qualifier value="datasource2"/>
        <property name="targetDataSource">
            <bean class="org.springframework.jndi.JndiObjectFactoryBean">
                <property name="jndiName" value="java:comp/env/ak2Database"/>
                <property name="resourceRef" value="true"/>
            </bean>
        </property>
        <property name="identifier" value="shared"/>
    </bean>

</beans>

1 个答案:

答案 0 :(得分:0)

这不起作用的原因是因为xml配置总是覆盖了java配置(参见https://jira.spring.io/browse/SPR-7028)。

要解决这个问题,我需要创建一个与不同名称的bean,然后创建xml中的名称,并将新bean标记为@Primary

所以现在我将有三个数据源bean,两个连接到相同的数据库模式,但只有一个标记为Primary,因此它将用于默认位置而不是xml定义的。