java - 使用 Spring 进行 self 注入(inject)

标签 java spring dependency-injection ioc-container

我在 Spring 3.x 中尝试了以下代码,但由于 BeanNotFoundException 而失败,它应该根据我之前提出的问题的答案 - Can I inject same class using Spring?

@Service
public class UserService implements Service{
    @Autowired
    private Service self;
}

由于我在 Java 6 上尝试过这个,我发现以下代码可以正常工作:

@Service(value = "someService")
public class UserService implements Service{
    @Resource(name = "someService")
    private Service self;
}

但我不明白它是如何解决循环依赖的。

编辑:
这是错误消息。 OP 在对其中一个答案的评论中提到了它:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.spring.service.Service] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

最佳答案

更新:2016 年 2 月

Autowiring 将在 Spring Framework 4.3 中得到正式支持。实现可以看这个GitHub commit .


您不能自己 Autowiring 的最终原因是 Spring 的 DefaultListableBeanFactory.findAutowireCandidates(String, Class, DependencyDescriptor) 方法的实现明确排除了这种可能性。这在此方法的以下代码摘录中可见:

for (String candidateName : candidateNames) {
    if (!candidateName.equals(beanName) && isAutowireCandidate(candidateName, descriptor)) {
        result.put(candidateName, getBean(candidateName));
    }
}

仅供引用:bean 的名称(即尝试 Autowiring 自身的 bean)是 beanName。该 bean 实际上是一个 Autowiring 候选者,但上面的 if 条件返回 false(因为 candidateName 实际上等于 beanName)。因此,您根本无法将 bean 与自身 Autowiring (至少从 Spring 3.1 M1 开始)。

现在至于这是否是语义上的预期行为,这是另一个问题。 ;)

我会问于尔根,看看他要说什么。

问候,

Sam(核心 Spring 提交者)

附言我已经打开了一个 Spring JIRA 问题,以考虑使用 @Autowired 支持按类型 Autowiring 。欢迎在此处观看或投票支持此问题:https://jira.springsource.org/browse/SPR-8450

关于java - 使用 Spring 进行 self 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5152686/

相关文章:

java - 允许特定用户访问 Spring Security

java - 如何在调用任何其他类构造函数之前调用 Spring setter 方法?

scala - 添加和扩展通用编写器特征以进行逐步数据存储的最佳方法

java - 每个 SelectionKey(或 SelectionKeyImpl)是否都有一个可供我使用的唯一标识符 (id)?

Java 泛型返回 int[] 而不是 Integer[]

java - 比较 Java 中的子字符串

java - 如何从任务管理器中隐藏进程?

java - 无法配置 Spring Security 加载 .loginPage ("/login")只有默认页面有效或发送到/templates/index.html

spring - 了解所有实体通用的 Spring Data JPA 存储库

typescript - Angular 2 : Inject service into class