2016-02-19 248 views
1

我有一個例子是這樣的是否可以使用在同一個@Configuration類中定義的@Resource實例?

Other需要的MyBean一個實例,所以我創建一個屬性,使用該屬性在創建和Other

@Configuration 
public SomeClass { 

    @Resource 
    private MyBean b; 

    @Autowired 
    Environment env; 

    @Bean 
    public MyBean myBean() { 
     MyBean b = new MyBean(); 
     b.foo(env.getProperty("mb"); // NPE 
     return b; 
    } 

    @Bean 
    public Other other() { 
     Other o = new Other(o); 
     return o; 
    } 
} 

但我發現了類NullPointerException雖然初始化myBean對象,我想這是因爲env屬性尚未在此點連線。

如果我不使用這個bean並直接使用這個方法,那麼一切正常。

@Configuration 
public SomeClass { 

    @Autowired 
    Environment env; 

    @Bean 
    public MyBean myBean() { 
     MyBean b = new MyBean(); 
     b.foo(env.getProperty("mb"); // NPE 
     return b; 
    } 

    @Bean 
    public Other other() { 
     Other o = new Other(myBean()); 
     return o; 
    } 
} 

難道是因爲我確定在同一個@Configuration@Bean

+1

如果你在'b''字段中替換'@ Autowired'的'@ Resource'註解,我猜它可以正常工作嗎? –

+0

@XtremeBiker好耶,工作。你能把它作爲答案發布嗎? – OscarRyz

回答

1

儘管它作爲一個概念性問題很有趣,但Spring Java配置的方式只是將所需的bean作爲參數傳遞,所以您應該避免將bean自動裝配爲配置類的字段。如果您有任何豆碰巧需要MyBean實例,只是將它作爲一個參數:

@Bean 
public Other other(MyBean myBean) { 
    Other o = new Other(myBean); 
    return o; 
} 

有呼籲從配置類@Bean anotated方法也沒有問題,因爲你在你的第二個代碼片段做,因爲它們是proxied and cached,所以它們不會創建不必要的實例。但是,我傾向於遵循上面的代碼,因爲它允許開發人員快速瞭解所需的依賴關係。

話雖如此,對於您的具體問題@Autowired工作而不是@Resource,但在@Configuration類中使用它們中的任何一個都沒有意義。只需使用本地方法參數。

相關問題