10

使用Spring IoC允許設置通過制定者暴露的bean屬性:的Spring bean字段注入

public class Bean { 
    private String value; 
    public void setValue(String value) { 
     this.value = value; 
    } 
} 

和bean定義是:

<bean class="Bean"> 
    <property name="value" value="Hello!"> 
</bean> 

是否有Spring框架的任何現有的插件/類,允許直接暴露bean字段作爲屬性而不定義setter?像這樣用相同的bean定義:

public class Bean { 
    @Property 
    private String value; 
} 
+0

我不明白你在做什麼?你想要在字段中注入字符串? – Bozho 2010-10-04 10:46:48

+0

不完全。我想在沒有編寫setter方法的情況下將field作爲屬性公開。 – Vladimir 2010-10-04 10:51:57

+0

這是一個很好的問題,我想。 Spring MVC可以爲MVC命令對象進行直接字段注入,因此,爲bean屬性考慮直接字段注入是明智的。不過,我不相信春天有什麼辦法可以做到這一點。 – skaffman 2010-10-04 10:55:45

回答

6

您可以:

  • 使用@Value註釋和(使用表達式語言)注入屬性
  • Project Lombok看一看,這將讓你跳過所有setter和getters(和更多)
+2

@Value註釋將資源定位器替換爲IoC。它需要在java代碼中定義屬性值。我不能有2個不同的屬性具有不同的實例。這就是爲什麼我只想要作爲財產進行曝光。 – Vladimir 2010-10-04 11:13:34

+1

關於龍目島 - 在我的案例中使用這個項目似乎就像一把輪子上的槍。 – Vladimir 2010-10-04 11:15:52

+0

龍目島是要走的路。只需用@Setter註釋你的私人領域,就是這樣。沒有運行時依賴,你只需要在編譯時使用lombok,生成的.class文件將使用setter方法。唯一的問題是,當你想用類似@Required的方式來註釋該方法。 – Chochos 2011-04-20 15:38:03

1

你所要求的是不可能的。 Spring通過配置約定約定。所以它期望那裏有制定者和獲得者。 Spring可以直接進行場噴射;而Spring使用Reflection來實現這一點,Spring並沒有提供反轉這個過程來使用Reflection來訪問沒有setter或getters的字段。即使Spring AOP實現期望找到構造它的代理的方法。