我尝试了以下使用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)}
@Transactional
注释能够正常工作。调用this.myMethod()
将忽略事务,但是self.myMethod()
应该创建事务。请参见第5.1节 潜在陷阱-事务和代理。 - Snackoverflow@Transactional
并且类被标记为@Autowired
作为依赖项时,Spring实际上会注入一个代理实例来包装您的类实例,并且在代理实现中,该方法也被一个带有事务逻辑的代理方法包装。如果您直接使用this.myMethod()
,则是从您的类实例代码内部进行引用您的类实例方法目录,并且没有调用具有事务逻辑的注入代理。https://spring.io/blog/2012/05/23/transactions-caching-and-aop-understanding-proxy-usage-in-spring - Snackoverflow