【问题标题】:@Autowired & Spring context hierarchy@Autowired & Spring 上下文层次结构
【发布时间】: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


    【解决方案1】:

    这取决于您的 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 没有可见性,反之亦然。

    【讨论】:

    【解决方案2】:

    两者都有。如果 bean 被定义了两次,首先在 A 中,然后在 B 中,B 将覆盖 A。另请参阅此答案 https://stackoverflow.com/a/4250093/1937263

    【讨论】:

    • 但它可以在 B 和 C 上下文中被覆盖。 Spring会选择哪个?
    【解决方案3】:

    @Autowired 注解是通过匹配数据类型自动连接 bean。

    因此,在您的情况下,它将查找 MyBean 类型的 bean。

    它总是首先查看当前的应用程序上下文。当给定的 ApplicationContext 无法解析 bean 时,它会将解析请求传递给其父级。因此它将从您拥有@Autowired private MyBean myBean 的应用程序上下文开始。

    【讨论】:

    • 问题是它会在哪里看?换句话说,在哪个上下文中?假设 bean 存在于所有 3 个上下文中......
    • 当前应用程序上下文是什么意思?我们有两个兄弟姐妹的情况。我的意思是BC 都扩展了A。其中哪些将是最新的?
    猜你喜欢
    • 2012-12-28
    • 1970-01-01
    • 2016-06-18
    • 2012-12-21
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    相关资源
    最近更新 更多