Pre*_*raj 58 java spring dependency-injection ioc-container
我尝试使用Spring 3.x的以下代码失败了BeanNotFoundException,它应该根据我之前问过的问题的答案 - 我可以使用Spring注入相同的类吗?
@Service
public class UserService implements Service{
@Autowired
private Service self;
}
Run Code Online (Sandbox Code Playgroud)
自从我用Java 6尝试这个以来,我发现以下代码工作正常:
@Service(value = "someService")
public class UserService implements Service{
@Resource(name = "someService")
private Service self;
}
Run Code Online (Sandbox Code Playgroud)
但我不明白它如何解决循环依赖.
编辑:
这是错误消息.OP在其中一个答案的评论中提到它:
由以下原因引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型为[com.spring.service.Service]的匹配bean:期望至少有一个bean可以作为此依赖项的autowire候选者.依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}
Sam*_*nen 46
更新:2016年2月
Spring Framework 4.3将正式支持自动装配.可以在此GitHub提交中看到实现.
你不能自己动手的最终原因是Spring的DefaultListableBeanFactory.findAutowireCandidates(String, Class, DependencyDescriptor)方法的实现明确排除了这种可能性.这在以下代码摘录中可见:
for (String candidateName : candidateNames) {
if (!candidateName.equals(beanName) && isAutowireCandidate(candidateName, descriptor)) {
result.put(candidateName, getBean(candidateName));
}
}
Run Code Online (Sandbox Code Playgroud)
仅供参考:bean的名称(即,尝试自动装配的bean)是beanName.那个bean实际上是一个autowire候选者,但上面的if-condition返回false(因为candidateName实际上等于beanName).因此,您根本无法自动将bean自动装配(至少不是Spring 3.1 M1).
现在至于这是否是从语义上讲的预期行为,这是另一个问题.;)
我会问Juergen,看看他有什么要说的.
问候,
山姆(核心春天提交者)
ps我打开了一个Spring JIRA问题,考虑使用@Autowired按类型支持自动装配.欢迎观看或投票支持此问题:https://jira.springsource.org/browse/SPR-8450
sin*_*pop 34
这段代码也适用:
@Service
public class UserService implements Service {
@Autowired
private ApplicationContext applicationContext;
private Service self;
@PostConstruct
private void init() {
self = applicationContext.getBean(UserService.class);
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道为什么,但似乎Spring可以从ApplicationContextif 创建,但没有初始化.@Autowired在初始化之前工作,它找不到相同的bean.所以,@Resource也许@Autowired之前和之后都有效@PostConstruct.
但我不知道,只是猜测.无论如何,好问题.
| 归档时间: |
|
| 查看次数: |
28798 次 |
| 最近记录: |