gpt4 book ai didi

java - 使用 XML 配置覆盖 @Autowired 属性注解

转载 作者:行者123 更新时间:2023-11-29 05:04:15 24 4
gpt4 key购买 nike

我有一个 EntityLoader 类,用于使用 Hibernate 从 MySQL 数据库中获取一些数据。但现在需要从两个不同的数据库(在本例中为 MySQL 和 Oracle)获取数据。所以我想拥有两个 EntityLoader 的 bean,但在每个 bean 中注入(inject)不同的 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">

到目前为止一切正常。在此我做了以下更改:

  • component-scan 中排除 EntityLoader 以避免自动创建 EntityLoader
  • 添加 mysqlSessionFactoryoracleSessionFactory bean 定义
  • 添加 mysqlEntityRepoLoaderoracleEntityRepoLoader bean 定义

请注意,在 mysqlEntityRepoLoaderoracleEntityRepoLoader 中,我添加了属性 autowired="no" 希望这会告诉 Spring 不要 Autowiring SessionFactory 而是使用定义的 ref。

生成的配置是:

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

<bean id="mysqlSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<!-- ... config ... -->
</bean>
<bean id="oracleSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<!-- ... config ... -->
</bean>

<bean id="mysqlEntityRepoLoader" class="com.dome.imserso.api.core.data.EntityRepoLoader" autowire="no">
<property name="sessionFactory" ref="mysqlSessionFactory"/>
</bean>
<bean id="oracleEntityRepoLoader" class="com.dome.imserso.api.core.data.EntityRepoLoader" autowire="no">
<property name="sessionFactory" ref="oracleSessionFactory"/>
</bean>

但无论如何,Spring 似乎首先尝试 Autowiring SessionFactory。我收到以下错误:

No qualifying bean of type [org.hibernate.SessionFactory] is defined: expected single matching bean but found 2: mysqlSessionFactory,oracleSessionFactory

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

有什么办法可以不去掉注解就完成吗?

最佳答案

如果您能够修改包含 EntityLoader 的库,则执行以下两步即可:

  1. EntityLoader 中使您的 @Autowired 可选:

    @Autowired(required=false)

  2. 在 XML 配置中,从 Autowiring 候选对象中排除 mysqlSessionFactory 和 oracleSessionFactory beans,将 autowire-candidate="false" 添加到每个 sessionFactory:

<bean id="mysqlSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" autowire-candidate="false">
<!-- ... config ... -->
</bean>
<bean id="oracleSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" autowire-candidate="false">
<!-- ... config ... -->
</bean>

瞧!

关于java - 使用 XML 配置覆盖 @Autowired 属性注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30980076/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com