我在 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/