【问题标题】:Lazy init an injected bean dependency (Spring 3)延迟初始化注入的 bean 依赖项(Spring 3)
【发布时间】:2013-07-08 23:11:36
【问题描述】:

如何延迟初始化 @Inject 的依赖项?

public class ClassA {
  @Inject
  ClassB classB;
}


@Configuration
public class Config {
    @Bean
    public ClassA classA() {
        return new ClassA();
    }

    @Bean
    @Lazy
    public ClassB classB() {
        return new ClassB();
    }
} 

当 classA bean 被实例化时,classB bean 也被实例化,尽管有 @Lazy 注释。 如何避免 classB bean 实例化?

【问题讨论】:

  • 它很懒,直到你需要它。 Spring 需要对其进行实例化以将其注入ClassA,因此它会在那时被初始化。

标签: java spring dependency-injection inject lazy-initialization


【解决方案1】:

你真的不能那样做。正如 Sotirios 所说,Spring 需要将其实例化以将其注入到ClassA 中。您可能可以使用应用程序上下文手动完成。类似的东西:

public class ClassA {

    @Inject
    private ApplicationContext appContext;

    private ClassB classB;

    //Bean will be instanciated when this method is called
    public ClassB getClassB() { 
        if (classB == null) {
            classB = appContext.getBean(ClassB.class);
        }
        return classB;
    }
}

然后使用getter来访问对象。

【讨论】:

  • 所以惰性初始化仅适用于不是 '@Inject' 或 '@Autowired' 的属性?这似乎有点限制,因为据我所知,这些注释总是在新版本的 Spring 中使用。如果 bean 是在 xml 文件中设置的,那么惰性会起作用吗?
  • 我想你不明白 Lazy init、bean 作用域和注入是如何协同工作的。 Lazy init 旨在与“@Inject”或“@Autowired”一起使用,但在具有单例范围的 bean 中注入惰性 bean 并没有真正意义。如果将 bean 放在 XML 中,它会做同样的事情......最后,带有 Lazy = true 的 Singleton bean 像 Prototype bean 一样被实例化,不同之处在于当 bean 实例化时它总是返回相同的实例。
  • 非常感谢您的回答。确实,我不明白惰性初始化和 bean 范围之间的关系。在单例中如此懒惰是没有意义的,因为 spring 会在启动时创建 bean 的实例;原型 bean 在启动时没有初始化,但这不是默认的吗? @Lazy 在哪里有所作为?或者原型bean的惰性依赖没有被初始化,即使原型bean被初始化了,但是单例bean的惰性依赖总是被初始化?
  • 我的意思是,将惰性单例 bean 注入到具有单例范围但不是惰性的 bean 中是没有意义的。懒豆一般都是单例的。例如,如果您在原型 bean 中注入惰性单例 bean,则在原型 bean 实例化之前,不会实例化单例 bean。在这种情况下,懒惰意味着一些东西,如果你的单例不是懒惰的,它会在启动时被实例化。因此,当您将惰性单例 bean 注入到启动时未实例化的原型 bean 中时,它开始变得有意义。
  • 谢谢,现在说得通了。
猜你喜欢
  • 1970-01-01
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多