spring自我注射

我尝试了Spring 3.x下面的代码,它与BeanNotFoundException失败,它应该根据问题的答案之前,我问 – 我可以使用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]types的匹配bean:期望至less1个符合此依赖关系的autowire候选者。 依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}

更新:2016年2月

自动assembly将在Spring Framework 4.3中正式得到支持。 这个实现可以在这个GitHub提交中看到。


你不能自动assembly自己的确切原因是Spring的DefaultListableBeanFactory.findAutowireCandidates(String, Class, DependencyDescriptor)方法的实现明确排除了这种可能性。 这在以下代码摘录中可见:

 for (String candidateName : candidateNames) { if (!candidateName.equals(beanName) && isAutowireCandidate(candidateName, descriptor)) { result.put(candidateName, getBean(candidateName)); } } 

FYI:bean的名称(即试图自动装载的bean)是beanName 。 这个bean实际上是一个autowire候选者,但是上面的if条件返回false(因为candidateName实际上等于beanName )。 因此,你根本不能用自己的方式自动装载bean(至less不能像Spring 3.1 M1那样)。

至于从语义上讲这是否是有意的行为,那是另外一个问题。 ;)

我会问Juergen,看看他要说什么。

问候,

山姆(核心spring提交者)

PS我已经打开了Spring JIRA的问题,考虑支持使用@Autowiredtypes的自动自动assembly。 随时观看或投票在这里问题: https : //jira.springsource.org/browse/SPR-8450

这个代码也可以工作:

 @Service public class UserService implements Service { @Autowired private ApplicationContext applicationContext; private Service self; @PostConstruct private void init() { self = applicationContext.getBean(UserService.class); } } 

我不知道为什么,但似乎Spring可以从ApplicationContext获得bean,如果创build ,但没有初始化@Autowired在初始化之前工作,并且找不到相同的bean。 所以, @Resource可能在@Autowired@PostConstruct之前工作。

但我不知道,只是猜测。 无论如何,很好的问题。

顺便说一下,自调用问题的更优雅的解决scheme是使用AspectJ加载时间编织来处理您的事务代理(或者您使用的任何AOP引入的代理)。

例如,使用注释驱动的事务pipe理,您可以使用“aspectj”模式,如下所示:

 <tx:annotation-driven mode="aspectj" /> 

请注意,默认模式是“代理”(即,JDKdynamic代理)。

问候,

山姆

从对象本身获取AOP代理问题build议与AopContext.currentProxy()可能适合特殊情况下的替代hacky方法。

它看起来像spring创build和configuration一个对象,然后将其放在bean查找上下文中。 但是,在Java的情况下,我认为它创build对象,并将其绑定到名称和configuration期间,当对象被在上下文中find的名称查找时。

鉴于上面的代码,我没有看到循环依赖。 您将一些服务实例注入到UserService中。 注入服务的实现不一定需要是另一个UserService,因此不存在循环依赖关系。

我不明白为什么你会注入UserService到UserService,但我希望这是一个理论尝试或这样的。

使用@Resource注解:

 @Service("service") public class ServiceImpl implements Service { @Resource(name = "service") private Service self; } 

为什么不使用“this”而不是将相同的对象注入自己?