2016-06-09 36 views
0

我碰到這個代碼我們爲什麼在這裏標註類@Autowire

@Singleton 
    @Controller 
    @Autowire(mode = AutowireMode.BY_NAME) 
    @Path("/") 
    public class RootResource { 
    } 

我看到@Autowire上的字段, 這意味着按類型自動裝配,與類別這一領域將獲得與特定類型的豆。

但是在上面的代碼中我不確定誰在使用這個RootResource bean?

這是Spring-Jersey Rest項目。

我的理解是spring會創建RootResource的bean,並且Some class將使用這個bean來設置它的屬性。 (我不能看到這個bean的任何明確的配置)

我的問題是,

1)這是誰的班?

2)在這裏按名稱自動裝配完成後,我可以用@Resource替換@Autowired嗎?

回答

0

在這種情況下使用@Autowire是指示Spring容器通過使用名稱與RootResource中的屬性名稱匹配的bean來將依賴關係注入RootResource。

這與使用XML配置的bean元素的autowire屬性類似。假設RootResource有

@Singleton 
@Controller 
@Autowire(mode = AutowireMode.BY_NAME) 
@Path("/") 
public class RootResource{ 

    private SomeService someService; 

    private AnotherService anotherService; 

    public void setSomeService(SomeService someService){ 
     this.someService = someService; 
    } 

    public void setAnotherService(AnotherService anotherService){ 
     this.anotherService = anotherService; 
    } 

} 

容器將嘗試查找名爲someService和anotherService的bean,並嘗試設置相應的屬性。請注意,您不需要依賴注入屬性或字段級別的註釋。

您可以使用@Resource/@Autowired來實現同樣的目的。但是在這種情況下,您必須註釋字段或設置者。並且還如果依賴未在容器發現注射將失敗

@Singleton @Controller @Autowire(模式= AutowireMode.BY_NAME) @Path( 「/」) 公共類RootResource {

private SomeService someService; 

    private AnotherService anotherService; 

    @Resource 
    public void setSomeService(SomeService someService){ 
     this.someService = someService; 
    } 

    @Resource 
    public void setAnotherService(AnotherService anotherService){ 
     this.anotherService = anotherService; 
    } 

} 

@Resource將使用bean的名稱和回落到類型匹配,同時@Autowired總是使用類型匹配

還要注意的是@Autowire和@Autowired有不同的行爲。 RootResource bean不需要在應用程序上下文中明確配置。它將由組件掃描儀自動檢測,因爲它具有原型註釋,即@Controoler

相關問題