【问题标题】:How does spring self injection works with @Resource?spring 自注入如何与@Resource 一起工作?
【发布时间】:2011-08-30 04:32:12
【问题描述】:

这是一个了解弹簧内部结构的问题。由于@Autowired 不起作用,建议在春季自我注入 bean 的一些解决方法。这里是fewthreads。我想知道自注入在技术上与@Resource 注释一起工作的原因以及如何工作?

@Service(value = "someService") public class UserService implements Service{ @Resource(name = "someService") private Service self; }

任何指向 spring 源代码的链接都将不胜感激。谢谢。

【问题讨论】:

  • 一开始你为什么要做这么可怕的事情?
  • 让 Spring AOP 拦截内部方法调用。仅仅因为这个原因转向 AspectJ 似乎不切实际。
  • 如果你需要这个,那么你不应该使用基于代理的方法,这真的不是改变,而是根据需要选择正确的东西,而不是试图找到可怕的解决方法。甚至 Spring docs 也建议如果您使用的是 Spring AOP,那么您不应该使用自调用,否则请查看 AspectJ,因为它没有自调用问题。
  • @Falcon:但有时避免自调用会非常尴尬(例如,因为 AOP 支持正在改进到现有的复杂应用程序中),并且 AspectJ 编织器可能与某些环境交互不佳。跨度>
  • 有时应用程序只在少数地方需要这种自注入功能。因此,没有太多需要转向 AspectJ。 AspectJ 有自己的一组功能,例如编译时编织、各种更多的连接点,然后是 Spring AOP,只有在实际需要时才能使用:)

标签: spring annotations


【解决方案1】:

我不知道 spring 究竟是如何处理它的,但这里有几个选项(例如 CDI 规范使用这些):

  • 不完整的实例。当 bean 被实例化并放入上下文时,它们的状态被设置为“不完整”——也就是说,它们的实例存在但它们的依赖关系没有被注入。因此,第一个 bean 被实例化,放入上下文中,然后在下一个阶段注入它们的依赖项。这使得上述情况变得微不足道 - 容器首先创建实例,然后对于每个注入点,从上下文中获取所需的 bean - 在这种情况下是自身

  • 代理。为每个 bean 创建一个代理,以便它拥有 bean 而无需实际实例化 bean。它创建代理(通过接口/具体类),将它们相互注入,并在需要时传递代理。最后,每个代理都得到它的实际 bean。上面的情况可能不是这样,因为 CDI 使用它来处理循环构造函数注入。

【讨论】:

  • 这个问题背后的意图是了解为什么@Resource 有效而@Autowired 无效。我的问题中的链接线程之一解释了@Autowired 不起作用的原因。我想了解@Resource 为何有效- 基本上了解Spring 如何分别处理@Resource 然后@Autowired 因为两者似乎都在做同样的工作- 注入依赖项
【解决方案2】:

从另一个thread 我得到了一个看起来还不错的回复。基本上它声明spring特别添加了处理@Autowired bean的防御性检查,但@Resource bean绕过它,因此它可以工作。

【讨论】:

    猜你喜欢
    • 2014-06-17
    • 2018-03-11
    • 1970-01-01
    • 2015-01-29
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多