4

如何延迟初始化@Inject的依赖项?懒惰初始化注入bean依赖关系(Spring 3)

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实例化?

+1

这是懒惰的,直到你需要它。 Spring需要实例化它以将其注入到'ClassA'中,因此它在此时被初始化。 –

回答

0

你不能这样做。就像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访问该对象。

+1

如此懒惰的init仅适用于不是'@Inject'或'@Autowired'的属性?这似乎有点限制,因为据我所知,这些注释总是在新版本的Spring中使用。如果这个bean被设置在一个xml文件中,懒惰会起作用吗? – Ana

+0

我想你不明白懒惰的init,bean作用域和注入是如何协同工作的。惰性init旨在与'@Inject'或'@Autowired'一起使用,但在具有单例作用域的bean中注入惰性bean没有任何意义。如果你把这个bean放在一个XML中,它会做同样的事情......最后,带有Lazy = true的Singleton bean被实例化为一个Prototype bean,不同之处在于,当bean实例化时它总是返回相同的实例。 –

+0

非常感谢您的回答。的确,我不理解惰性init和bean范围之间的关系。懒得单身没有意义,因为spring会在启动时创建一个bean的实例;原型bean在启动时没有初始化,但是这不是默认的? @Lazy在哪里发挥作用?或者原型bean的惰性依赖关系不会被初始化,即使原型bean被初始化,但是singleton bean的惰性依赖关系总是被初始化? – Ana