2013-07-10 115 views
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