需要单个 bean,但即使在 Spring 配置中引用时也找到了 2 个

Required Single bean but 2 were found even when referenced in Spring config

springconfig.xml

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

   <context:annotation-config/>
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> 
        <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />  
        <property name="username" value="hr" />  
        <property name="password" value="hr" />  
    </bean>

    <bean id="prodDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> 
        <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />  
        <property name="username" value="hr" />  
        <property name="password" value="hr" />  
    </bean>

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">  
        <property name="dataSource" ref="dataSource"></property>  
    </bean>

    <bean id="prodJdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">  
        <property name="dataSource" ref="prodDataSource"></property>  
    </bean>  

</beans>  

我的主要 class 也是这样的:

@ImportResource("springconfig.xml")
@SpringBootApplication
public class TestingFrameworkrunner {

    public static void main(String[] args) {
        ConfigurableApplicationContext context=SpringApplication.run(TestingFrameworkrunner.class, args);
        EmployeeDao employeeDao=context.getBean("employeeDao",EmployeeDao.class);
        employeeDao.deleteEmployee(1);
        employeeDao.getAllEmployees().forEach(e->e.display());
        context.close();
    }

}

这是我得到的错误-

Field jdbcTemplate in com.NettingTestingFramework.EmployeeDao required a single bean, but 2 were found:
    - dataSource: defined in class path resource [springconfig.xml]
    - prodDataSource: defined in class path resource [springconfig.xml]


Action:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

在我的 dao 文件中我有:

@Component
public class EmployeeDao {

    @Autowired
    JdbcTemplate jdbcTemplate;

    @Autowired
    JdbcTemplate prodJdbcTemplate;

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public void setProdJdbcTemplate(JdbcTemplate prodJdbcTemplate) {
        this.prodJdbcTemplate = prodJdbcTemplate;
    }

    public void addEmployee(Employee e) {
        String sql="INSERT INTO EMPLOYEE VALUES(?,?,?,?)";
        jdbcTemplate.update(sql,new Object[] {e.getId(),e.getName(),e.getDescription(),e.getSalary()});
    }
}

为什么会出现这个错误?我已经为两个 jdbcTemplates 提供了数据源。另外现在我们可以忽略数据源属性值,因为它们对于两个数据源来说是不同的。

所以我在 springconfig.xml 中使用了 ref,如下所示,我已经自动连接了两个 jdbcTemplates。

"prodjdbcTemplate"用于连接产品数据库。

"jdbcTemplate" 用于连接性能数据库。

更新

当我将 main class 更改为 :

package com.NettingTestingFramework;

import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestingFrameworkrunner {

    public static void main(String[] args) {
        ConfigurableApplicationContext context=new ClassPathXmlApplicationContext("springconfig.xml");
        EmployeeDao employeeDao=context.getBean("employeeDao",EmployeeDao.class);
        employeeDao.deleteEmployee(1);
        employeeDao.getAllEmployees().forEach(e->e.display());
        context.close();
    }

}

并从 EmployeeDao 中删除了 @Component class 并在 springconfig 中创建了一个空 bean,例如:

<bean id="employeeDao" class="com.NettingTestingFramework.EmployeeDao">

    </bean>

一切正常。但最大的问题是为什么之前的东西不起作用? 因为我希望这是一个 SpringBootApplication 是否有一些解决方案,以便我可以像在我以前的代码中那样做。

错误非常清楚。您只能在(dataSource 和 prodDatasource)之间使用一个数据源。

在您的 XML 中删除其中一个或将其中一个设为主要。

它应该是同一个 bean,您只需在每个环境的配置文件中更改 url 和凭证。