我在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在对以下答案之一的评论中提到了它:

最佳答案

更新:2016年2月

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

无法自动连线的最终原因是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与自身连接(至少从Spring 3.1 M1开始)。

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

我问Juergen,看看他怎么说。

问候,

山姆(核心 Spring 通勤者)

ps我已经打开了Spring JIRA问题,考虑使用@Autowired按类型支持自我自动布线。请在此处随意观看或对此问题进行投票:https://jira.springsource.org/browse/SPR-8450

07-24 09:47
查看更多