2011-08-31 165 views

回答

52

是的,Spring可以調用私有構造函數。如果它找到一個具有正確參數的構造函數,而不管其可見性如何,它將使用反射來將其構造函數設置爲可訪問。

+0

您能否給我參考文檔?構造函數有參數,並在xml文件中爲這個參數賦值。 – user710818

+0

你的意思是說,如果一個bean有特定的東西像private bean(){...} spring可以調用它嗎?這是怎麼可能的,這違背了「私人」的全部目的。 –

+0

對不起,我可能錯了,它只是沒有參數的構造函數。我只是通過我在自己的項目中注意到的事情。我不能說我在任何地方的Spring文檔都見過它。但是這是負責實例化的類的javadoc。http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/beans/BeanUtils.html#instantiateClass(java.lang.reflect.Constructor,%20java.lang.Object .. ) –

-2

您通常會在這些bean中使用靜態工廠方法,您可以指定spring的方法來獲取該bean的實例。見3.3.1.3 here.這是Spring推薦的方式,而不是違反可見性限制。

+0

奇怪,沒有靜態方法,沒有公共構造函數,但是當我調試 - 調用私有構造函數!通過sun.reflect.NativeConstructorAccessorImpl – user710818

+0

沒有具體細節/代碼將不可能進一步評論! –

+0

我想你錯了。沒有特定的代碼 - 我在調試器中只看到標準的sun/spring方法。 – user710818

3

您可以隨時使用一個工廠方法來創建豆,而不是依靠一個默認的構造,從The IoC container: Instantiation using an instance factory method

<!-- the factory bean, which contains a method called createInstance() --> 
<bean id="serviceLocator" class="com.foo.DefaultServiceLocator"> 
    <!-- inject any dependencies required by this locator bean --> 
</bean> 

<!-- the bean to be created via the factory bean --> 
<bean id="exampleBean" 
     factory-bean="serviceLocator" 
     factory-method="createInstance"/> 

這樣做,你可以使用非默認的構造函數爲你的bean的優勢,而且也可以注入工廠方法bean的依賴關係。

+0

有趣,但我找不到工廠。可能存在另一種方式? – user710818

+0

@Matthew:他似乎在圍繞一些富有感染力的第三方代碼加裝Spring。這太麻煩了。 –

+1

@Donal,不,我不明白他在評論中說了些什麼。 –

2

是的,私人構造函數在春季被調用。 考慮我的代碼:

bean定義文件:

<bean id="message" class="com.aa.testp.Message"> 
     <constructor-arg index="0" value="Hi Nice"/> 
    </bean> 

Bean類:

package com.aa.testp; 

public class Message { 

    private String message; 

    private Message(String msg) { 
     // You may add your log or print statements to check execution or invocation 
     message = msg; 
    } 

    public String getMessage() { 
     return message; 
    } 

    public void setMessage(String message) { 
     this.message = message; 
    } 

    public void display() { 
     System.out.println(" Hi " + message); 
    } 

} 

上面的代碼工作正常。因此,Spring調用了私有構造函數。