Java 使用XML配置覆盖@Autowired属性批注

Java 使用XML配置覆盖@Autowired属性批注,java,spring,spring-annotations,xml-configuration,Java,Spring,Spring Annotations,Xml Configuration,我有一个类EntityLoader,用于使用Hibernate从MySQL数据库中获取一些数据。但现在需要从两个不同的数据库(本例中为MySQL和Oracle)获取数据。因此,我希望有两个EntityLoaderbean,但在每个bean中注入不同的SessionFactory EntityLoader定义如下: package com.demo @Component public class EntityLoader { @Autowired private Session

我有一个类
EntityLoader
,用于使用Hibernate从MySQL数据库中获取一些数据。但现在需要从两个不同的数据库(本例中为MySQL和Oracle)获取数据。因此,我希望有两个
EntityLoader
bean,但在每个bean中注入不同的
SessionFactory

EntityLoader
定义如下:

package com.demo

@Component
public class EntityLoader {

    @Autowired
    private SessionFactory sessionFactory;

    /* Code ... */

    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }   
}
上下文配置为:

<context:component-scan base-package="com.demo" />
<bean id="mysqlSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
但Spring似乎正在尝试在任何情况下首先自动连接
SessionFactory
。我得到以下错误:

未定义[org.hibernate.SessionFactory]类型的合格bean: 应为单个匹配bean,但找到2个: mysqlSessionFactory、oracleSessionFactory

如果我移除
@Autowired
所有功能都正常。但我想维护它,因为这段代码是用于其他应用程序的通用库的一部分,通常情况下只从一个数据库加载


有没有办法在不删除注释的情况下完成此操作?

导致问题的是组件扫描。您的bean已经手动创建,但是Spring正在尝试创建另一个
EntityLoader
,因为组件扫描正在提取您的
@组件
注释

您可以告诉组件扫描(仅针对您的应用程序)忽略该类:

<context:component-scan ...>
    <context:exclude-filter expression="com\.demo\.EntityLoader" type="regex" />
</context:component-scan>

如果您能够修改包含EntityLoader的lib,请执行以下两个步骤:

  • EntityLoader
    中,将您的
    @Autowired
    设置为可选:

    @自动连线(必需=错误)

  • 在XML配置中,将mysqlSessionFactory和oracleSessionFactory bean从autowire候选中排除,将
    autowire候选=“false”
    添加到每个sessionFactory:

  • 
    

    您可以创建一个名为
    sessionFactory
    …的虚拟bean,只需从
    EntityLoader
    中删除
    @Component
    注释即可?您正在手动创建XML中的实例(因此无需
    @组件
    ),并且您正在通过调用
    setSessionFactory
    方法在会话工厂中手动连接(因此无需
    @Autowired
    )。如果我删除注释,则需要在使用它的所有其他应用程序中以XML配置此bean。我的目的正是为了避免这种情况。我已经在
    组件扫描中使用了
    排除过滤器
    。在任何情况下,如果我删除
    @组件
    ,但保留
    @自动连线
    ,问题仍然存在。我认为问题在于spring自动连线属性时忽略了我的xml配置。好像注释优先于xml。谢谢!你是对的!该键为
    autowire candidate=“false”
    <context:component-scan ...>
        <context:exclude-filter expression="com\.demo\.EntityLoader" type="regex" />
    </context:component-scan>