【发布时间】:2011-07-06 09:05:06
【问题描述】:
我在 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 在对其中一个答案的评论中提到了它:
原因:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型为 [com.spring.service.Service] 的匹配 bean:预计至少有 1 个 bean 有资格作为此依赖项的自动装配候选者。依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true)}
【问题讨论】:
-
额外问题:这里自我注入的目的是什么?
-
@OrkunOzen 简单用例:您希望
@Transactional注释在从内部调用同一类的另一个方法时正常工作。调用this.myMethod()将忽略事务,但self.myMethod()应该创建事务。见Section 5.1. Potential Pitfalls - Transactions and Proxies。 -
@Snackoverflow,另一个额外的问题:this.myMethod() 如何忽略事务?
-
@GB11 AFAIK 当方法用
@Transactional注释并且类是@Autowired作为依赖项时,Spring 实际上会注入一个包装您的类实例的代理实例,并且在代理实现中方法也由具有事务逻辑的代理方法包装。如果你直接使用this.myMethod(),你是在你的类实例代码中做的,引用你的类实例方法目录,而不是用事务逻辑调用注入的代理. spring.io/blog/2012/05/23/… -
@GB11 这是另一个来源; Spring documentation: 8.6 Proxying mechanisms(短读)
标签: java spring dependency-injection ioc-container