2011-08-31 594 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调用了私有构造函数。