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
设置为可选:
@自动连线(必需=错误)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>