【发布时间】:2014-07-02 23:01:00
【问题描述】:
假设我有应用程序上下文层次结构:A(父)、B(扩展 A)、C(扩展 A)。
假设现在我写了类似@Autowired private MyBean myBean
问题: Spring 在哪里寻找myBean?换句话说,它会在哪个上下文中显示?假设 bean 存在于所有 3 个上下文中..
【问题讨论】:
标签: java spring spring-mvc dependency-injection
假设我有应用程序上下文层次结构:A(父)、B(扩展 A)、C(扩展 A)。
假设现在我写了类似@Autowired private MyBean myBean
问题: Spring 在哪里寻找myBean?换句话说,它会在哪个上下文中显示?假设 bean 存在于所有 3 个上下文中..
【问题讨论】:
标签: java spring spring-mvc dependency-injection
这取决于您的 MyBean 是从哪个上下文引用的。
请看以下场景:
假设 MyBean 在 bean ReferencingBean 中被引用。
场景 1: 如果 ReferencingBean 在上下文 A 中,autowire 将从上下文 A 中获取 MyBean。
场景 2: 如果 ReferencingBean 在上下文 B 中,autowire 将从上下文 B 中获取 MyBean。
场景 3: 如果 ReferencingBean 在上下文 C 中,autowire 将从上下文 C 中获取 MyBean。
子上下文 bean 不能被交叉引用。意思是,如果 ReferencingBean 在上下文 B 中,它对上下文 C 没有可见性,反之亦然。
【讨论】:
两者都有。如果 bean 被定义了两次,首先在 A 中,然后在 B 中,B 将覆盖 A。另请参阅此答案 https://stackoverflow.com/a/4250093/1937263
【讨论】:
@Autowired 注解是通过匹配数据类型自动连接 bean。
因此,在您的情况下,它将查找 MyBean 类型的 bean。
它总是首先查看当前的应用程序上下文。当给定的 ApplicationContext 无法解析 bean 时,它会将解析请求传递给其父级。因此它将从您拥有@Autowired private MyBean myBean 的应用程序上下文开始。
【讨论】:
B 和C 都扩展了A。其中哪些将是最新的?