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”而不是将相同的对象注入自己?