2016-11-29 25 views
0

當setter和constructor注入應用於同一個類時,我需要知道什麼是首選順序。Spring Bean容器中的首選順序

我寫了一個演示代碼,發現它優先使用setter注入。

<bean id="wolf" class="com.sac.DI.Wolf" /> 
<bean id="lion" class="com.sac.DI.Lion" /> 
<bean id="zoo" class="com.sac.DI.Zoo"> 
    <constructor-arg ref="lion" /> 
    <property name="wild" ref="wolf" /> 
</bean> 

Zoo bean如下所示。

package com.sac.DI; 

public class Zoo { 

    private WildAnimal wild; 

    public Zoo(WildAnimal animal) { 
     this.wild = animal; 
    } 

    public void setWild(WildAnimal wild) { 
     this.wild = wild; 
    } 

    public void testSound() { 
     System.out.println(wild.sound()); 
    } 
} 

所以我的查詢是:

  1. 始終是它被優先考慮或有一些定義它屬性的設置注射。
  2. 爲什麼二傳手注射優先於構造器注入
+0

爲什麼。因爲首先一個對象被引用到'lion'中,那麼setter被稱爲覆蓋之前設置的'lion'到'wolf' ..它與喜好或偏好無關,這是你的方式配置了一些東西。 –

+0

不,如果我先把構造函數注入它再次給予setter注入 –

+0

再次,這就是你如何配置的東西(它與排序無關,並且從不會與排序有關)以及java如何工作。 ..你如何在非構造對象上調用setter ... –

回答

0

使用註釋,而不是XML配置,你可以看到更清晰的什麼M.Deinum說:

@Configuration 
public class Config { 
    @Bean 
    public WildAnimal wolf(){ 
     return new Wolf(); 
    } 

    @Bean 
    public WildAnimal lion(){ 
     return new Lion(); 
    } 

    @Bean 
    public Zoo zoo(){ 
     Zoo zoo = new Zoo(lion()); 
     zoo.setWild(wolf()); 
     return zoo; 
    } 
} 

首先,您使用構造器注入創建一個對象,那麼你使用setter注入來覆蓋屬性。

希望它有幫助。