限定符不适用于 Spring Boot 中的 DataSource
Qualifier doesn't work for DataSource in Spring Boot
我定义了两个数据源 "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>
这不起作用的原因是 xml 配置 总是 覆盖 java 配置(参见 https://jira.spring.io/browse/SPR-7028)。
为了解决这个问题,我需要创建一个名称与 xml 中的 不同 的 bean,并将该新 bean 标记为 @Primary
。
所以现在我将拥有三个数据源 bean,两个连接到相同的数据库模式,但只有一个被标记为主要的,因此它将在默认位置使用,而不是 xml 定义的一个。
我定义了两个数据源 "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>
这不起作用的原因是 xml 配置 总是 覆盖 java 配置(参见 https://jira.spring.io/browse/SPR-7028)。
为了解决这个问题,我需要创建一个名称与 xml 中的 不同 的 bean,并将该新 bean 标记为 @Primary
。
所以现在我将拥有三个数据源 bean,两个连接到相同的数据库模式,但只有一个被标记为主要的,因此它将在默认位置使用,而不是 xml 定义的一个。