这是一个了解spring internals的问题。有一些解决方法建议在春季自我注入一个bean,因为@Autowired不起作用。以下是few threads。我想知道为什么以及如何使用@Resource注释技术实现自注射?
@Service(value = "someService")
public class UserService implements Service{
@Resource(name = "someService")
private Service self;
}
任何指向spring源代码的链接都将受到赞赏。感谢。
答案 0 :(得分:2)
从另一个thread我得到了一个看起来相当不错的回复。基本上它声明spring专门为处理@Autowired bean添加防御性检查,但@Resource bean绕过它,因此它可以工作。
答案 1 :(得分:0)
我不知道spring究竟是如何处理它的,但这里有几个选项(例如CDI规范使用这些选项):
不完整的实例。当bean被实例化并放入上下文中时,它们的状态被设置为“不完整” - 也就是说,它们的实例存在,但它们的依赖关系不会被注入。因此,第一个bean被实例化,放入上下文,并在下一个阶段注入它们的依赖关系。这使得上述情况变得微不足道 - 容器首先创建实例,然后,对于每个注入点,从上下文中获取所需的bean - 本身,在这种情况下
代理。为每个bean创建一个代理,以便它具有bean而实际上没有实例化bean。它创建代理(通过接口/具体类),将它们互相注入,并在需要时传递代理。最后每个代理获得它的实际bean。这可能不是上面的情况,因为CDI使用它来处理循环构造函数注入。