2011-06-27 93 views
0

去之後通過autowiring concept 我有一些問題。它們是: -春季自動裝配疑惑?

  • ,如果我需要自動裝配下面byType類或byName,是強制要求在一流大學中setStudent()方法?

public class College { 

    private Student student1; 
    private String registration1; 
} 

  • <bean id="student1" class="Student"/> - 在byname情況下,它會考慮id屬性,並在bytype情況下,它會尋找在上述 Stetement class屬性。對?如果發現它找到兩個相同類型的bean dean標籤,則會在bytype的情況下引發致命錯誤。正確?

  • autodetect情景通過反省bean類來選擇constructorbyType。如果找到默認構造函數,將應用byType模式 。 我在這裏的問題,如果找不到默認的構造函數,並找到帶參數的構造函數,然後構造函數 autowire將被應用。正確?

  • 我們是否需要在College的某處指定@Autowired來應用自動裝配。我所看到的這this example ,但什麼也沒有規定here

+2

忽略roseindia.net上的任何內容,它通常寫得不好,誤導或錯誤。 – skaffman

回答

4

1),4)和Spring自動連接兩個分開的方式:基於annotaion基於XML和。

基於XML的自動裝配從XML配置中激活,如所述。最後,它會調用setter方法,所以在這裏需要setStudent()方法。

另一方面,基於分類的自動裝配通過反射魔術來執行。它試圖填充您標記爲@Autowired註釋的所有內容。事實上,它可以設置私有字段沒有存取,如

public class Foo { 
    @Autowired private Thingy thing; // No getThing or setThing methods 

    private void doStuff() { 
     // thing is usable here 
    } 
} 

@Autowired annotaion工作,你需要定義相應的bean後置處理器;它是通過添加以下行xml配置完成:

<context:annotation-config/> 

注意,這兩個自動連接方法是獨立的,而且是可能的(但不推薦)同時使用它們。在這種情況下,xml autowiring將覆蓋註釋。

2)一般來說,自動裝配將失敗,如果它找不到一個且只有一個候選人注射。所以,就你的情況而言,它會在創建容器時發生異常而失敗。有一些後備怪癖,但總的來說,它的工作可靠。

3)是的,文件說明如此。

關於byNamebyType自動裝配。雖然byName自動裝配只是試圖匹配bean名稱(可以用id屬性指定),但byTypeclass屬性查找複雜一些。它搜索類型,它將匹配接口。例如:

public interface SomeService { 
    void doStuff(); 
} 

public class SomeServiceImpl implements SomeService { 
    @Override public void doStuff() { 
     // Implementation 
    }; 
} 

public class ServiceUser { 
    @Autowired 
    private SomeService someService; // SomeServiceImpl instance goes here 
} 

P.S.你在你的問題中引用了兩個不同版本的Spring,2.5和3.0。自動裝配行爲在兩者中都是相同的。

+0

非常感謝。想通過下面的例子來確認point2 public class Student {private Address someAddress; }你的意思是說,這將失敗,而BeanFactory factor1 =新的XmlBeanFactory(SomeXml);對?另一點是 - Autowire byname將查看id屬性,bytype將查找XML中的類屬性是否正確? –

+0

2)是的,它應該以這種方式工作。嘗試編譯/運行並閱讀異常消息,它應該清除事情。 – miah

+0

@Mohit我填補了byName/byType info的答案。 – miah

1

另外,如果您使用@Autwired註釋,則需要將這些類標記爲自動裝配的候選對象。應該通過使用這些註解之一來進行:

@Repository 
@Service 
@Component 
@Controller 

而引起的,你可以在不同的範圍進行配置:

@Scope("prototype") 
@Repository 
public class MovieFinderImpl implements MovieFinder { 
    // ... 
} 

希望這使得它更清晰。

+0

這僅適用於自動檢測的組件。它與XML bean定義無關。 – skaffman

+0

@skaffman,當然:) –

相關問題