相关疑难解决方法(0)

自动装配两个bean实现相同的接口 - 如何将默认bean设置为autowire?

背景:

我有一个Spring 2.5/Java/Tomcat应用程序.有以下bean,在许多地方的整个应用程序中使用

public class HibernateDeviceDao implements DeviceDao
Run Code Online (Sandbox Code Playgroud)

和以下新的bean:

public class JdbcDeviceDao implements DeviceDao
Run Code Online (Sandbox Code Playgroud)

第一个bean配置为(包括所有bean)

<context:component-scan base-package="com.initech.service.dao.hibernate" />
Run Code Online (Sandbox Code Playgroud)

第二个(新)bean是单独配置的

<bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao">
    <property name="dataSource" ref="jdbcDataSource">
</bean>
Run Code Online (Sandbox Code Playgroud)

当然,这会导致启动服务器时出现异常:

嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义类型为[com.sevenp.mobile.samplemgmt.service.dao.DeviceDao]的唯一bean:期望的单个匹配bean但找到2:[deviceDao,jdbcDeviceDao]

从一个试图像这样自动装豆的类

@Autowired
private DeviceDao hibernateDevicDao;
Run Code Online (Sandbox Code Playgroud)

因为有两个bean实现相同的接口.

问题:

是否可以配置bean以便这样做

1.我不必对已经HibernateDeviceDao自动装配的现有类进行更改

2.仍然可以像这样使用第二个(新)bean:

@Autowired
@Qualifier("jdbcDeviceDao")
Run Code Online (Sandbox Code Playgroud)

即我需要一种方法将HibernateDeviceDaobean 配置为要自动装配的默认bean,同时允许在使用注释JdbcDeviceDao显式指定时使用@Qualifier.

我已经尝试过的:

我试过设置属性

autowire-candidate="false"
Run Code Online (Sandbox Code Playgroud)

在JdbcDeviceDao的bean配置中:

<bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao" autowire-candidate="false">
    <property name="dataSource" ref="jdbcDataSource"/>
</bean>
Run Code Online (Sandbox Code Playgroud)

因为Spring文档说明了这一点

指示在查找匹配候选项以满足另一个bean的自动装配要求时是否应考虑此Bean.请注意,这不会影响名称的显式引用,即使指定的bean未标记为autowire候选,也会解析引用.*

我解释为我仍然可以JdbcDeviceDao使用@Qualifier注释自动装配并具有HibernateDeviceDao默认bean.显然,我的解释是不正确的,因为这会在启动服务器时导致以下错误消息:

类型[class com.sevenp.mobile.samplemgmt.service.dao.jdbc.JdbcDeviceDao]的不满意依赖:预计至少有一个匹配的bean

来自我尝试使用限定符自动装配bean的类:

@Autowired
@Qualifier("jdbcDeviceDao")
Run Code Online (Sandbox Code Playgroud)

解: …

java spring spring-mvc autowired

132
推荐指数
3
解决办法
13万
查看次数

如何使用运行时"限定符"变量动态注入服务?

在给定运行时值的情况下,我找不到一种简单的方法来注入组件/服务.

我开始阅读@ Spring的文档:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-autowired-annotation-qualifiers 但我找不到如何变量传递给@Qualifier注释的值.

假设我有一个具有这种界面的模型实体:

public interface Case {

    String getCountryCode();
    void setCountryCode(String countryCode);

}
Run Code Online (Sandbox Code Playgroud)

在我的客户端代码中,我会做类似的事情:

@Inject
DoService does;

(...)

Case myCase = new CaseImpl(); // ...or whatever
myCase.setCountryCode("uk");

does.whateverWith(myCase);
Run Code Online (Sandbox Code Playgroud)

......我的服务是:

@Service
public class DoService {

    @Inject
    // FIXME what kind of #$@& symbol can I use here?
    // Seems like SpEL is sadly invalid here :(
    @Qualifier("${caze.countryCode}")
    private CaseService caseService;

    public void whateverWith(Case caze) {
        caseService.modify(caze);
    }

}
Run Code Online (Sandbox Code Playgroud)

我希望caseService是UKCaseService(参见下面的相关代码).

public interface CaseService {

    void modify(Case caze); …
Run Code Online (Sandbox Code Playgroud)

service spring dependency-injection autowired

18
推荐指数
1
解决办法
2万
查看次数

2个名称相同但包不同的bean,如何自动装配?

在我的java项目中,我有2个同名但不同包的实体,我也有这些实体对应的dao。

现在由于 2 个实体具有相同的名称,它给出了重复扫描错误,因此我使用它们的完全限定名称向这些实体添加了 name 属性。

例如:实体(name="pckEntity) & 实体(name="pabEntity)

但是现在我他们相应的 daos 无法自动装配,并且出现以下错误:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type...
Run Code Online (Sandbox Code Playgroud)

我是否必须更改 Dao 中的任何内容以支持实体中的这种“名称”属性更改。

我正在使用 Hibernate、JPA 和 Spring。

java spring hibernate jpa

5
推荐指数
1
解决办法
3193
查看次数