2017-01-26 93 views
1

我有以下部件,在兩個不同的文件:@Autowired是否照顧嵌套自動裝配?

@Component 
public class Chauffeur { 
    Car car; 

    public Chauffeur(Car car){ 
     this.car = car; 
    } 

    public void go(){ 
     System.out.println("Chauffeur"); 
     car.drive(); 
    } 
} 

@Component 
public class Car{ 
    public void drive() { 
     System.out.println("Drive car"); 
    } 
} 

下面的配置文件:

@Configuration 
@ComponentScan 
public class DriveableConfiguration { 
} 

和以下測試:上述

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes=DriveableConfiguration.class) 
public class DriveableTest { 
    @Autowired 
    Chauffeur chauffeur; 

    @Test 
    public void chauffeurTest(){ 
     chauffeur.go(); 
    } 
} 

所有類在相同的包裝和測試正在通過。

在測試中,我使用@Autowired註釋了chauffer,這應該表示Spring容器在創建Chauffeur實例之後不需要顯式實例化它。 現在,Chauffer的構造函數需要Car實例,所以沒有該類的默認構造函數。儘管如此,容器創建它,在構造函數中注入所需的實例。

@Autowired是否說容器實例化元素與它可以提供的任何(組件,豆),包含在構造函數中的參數?如果是這樣,在什麼情況下需要使用@Autowired來註釋構造函數?

回答

1

僅限於使用Spring 4.3+。在這種情況下,如果您有一個非默認構造函數,則構造函數@Autowired是可選的。

您可以查看示例here

因此從4.3開始,您不再需要在這樣的單構造方案中指定明確的注入註釋。這對於否則完全不帶有任何的容器註釋類特別優雅,例如,當編程註冊

對於比4.3更低的版本中,你一會拋出異常:

容器會拋出一個異常尋找一個默認的構造函數 ,除非你明確地表示自動裝配模式 「構造」在你的bean定義設置(例如,在XML)

相關問題