带有私有构造函数的JavaSpringbean

带有私有构造函数的JavaSpringbean,java,spring,constructor,javabeans,private,Java,Spring,Constructor,Javabeans,Private,在Spring中,bean类是否可能没有公共构造函数而只有私有构造函数? 当bean被创建时,这个私有构造函数会被调用吗? 谢谢。在这种bean中通常会有一个静态工厂方法,您可以为spring指定该方法来获取该bean的实例。请看,这是Spring推荐的方式,而不是违反可见性限制。是的,Spring可以调用私有构造函数。如果它找到具有正确参数的构造函数,不管可见性如何,它都将使用反射将其构造函数设置为可访问 您可以始终使用工厂方法来创建bean,而不是依赖默认构造函数,从: 这样做的好处是,可以

在Spring中,bean类是否可能没有公共构造函数而只有私有构造函数? 当bean被创建时,这个私有构造函数会被调用吗?
谢谢。

在这种bean中通常会有一个静态工厂方法,您可以为spring指定该方法来获取该bean的实例。请看,这是Spring推荐的方式,而不是违反可见性限制。

是的,Spring可以调用私有构造函数。如果它找到具有正确参数的构造函数,不管可见性如何,它都将使用反射将其构造函数设置为可访问

您可以始终使用工厂方法来创建bean,而不是依赖默认构造函数,从:


这样做的好处是,可以为bean使用非默认构造函数,也可以注入工厂方法bean的依赖项。

是的,私有构造函数由spring调用。 考虑我的代码:

Bean定义文件:

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

上面的代码运行良好。因此,spring调用了私有构造函数。

是的!Spring可以访问私有构造函数。 它的内部工作原理如下代码所示

       try{
    Class c= Class.forName("A"); // A - className
    Constructor c1[]=c.getDeclaredConstructors();
    c1[0].setAccessible(true);
    A a= (A)c1[0].newInstance();
    }
    catch (Exception e){
        e.printStackTrace();
    }

Spring永远不会将私有构造函数作为Bean范围调用。如果这样做,它将通过下面的错误

此问题的常见原因包括使用最终类或不可见类。嵌套异常是

java.lang.IllegalArgumentException:类中没有可见的构造函数


试一试,然后发布结果如何?这很难-我没有所有的源代码。奇怪的是,没有静态方法,没有公共构造函数,但是当我调试时-调用了私有构造函数!由sun.reflect.NativeConstructor Accessor提供如果没有详细信息/代码,将无法进一步评论!我想你错了。没有特定的代码-我在调试器中只看到标准的sun/spring方法。@Ashkan:我怀疑你得到了-1票,因为你错了。Spring可以在幕后窥视,除非有一个严格的安全管理器,并且Spring代码没有被标记为可信。@Ashkan:违背可见性限制是非常糟糕的风格。别这样!或者,如果你这样做了,你会为此感到非常难过。Spring这样做是因为它想将bean的定义从配置中分离出来,但它们通常仍然紧密相连。这个问题恰好是关于一个例外情况,在这种情况下,这是不正确的…你能给我参考文件吗?构造函数有参数,并在xml文件中为此参数分配了值。您的意思是,如果一个bean有像私有bean{…}这样的东西,spring可以调用它吗?这怎么可能,这违背了private的全部目的。对不起,我可能错了,因为它只是没有arg构造函数。我只是根据我在自己的项目中注意到的情况来做。我不能说我在任何地方的Spring文档中都见过它。但这是负责执行实例化的类的javadoc@Ashkan使用反射是可能的。特别是,SpringBeanutils类使用一个名为ReflectionUtils的类来访问构造函数。有关Constructor.setAccessible,请参见javadocs。@Kevin Stembridge您是正确的,可以使用Reflection.interest,但我找不到工厂。“可能存在另一种方式吗?”马修:他似乎在围绕某个令人讨厌的第三方代码对Spring进行改装。这肯定会很混乱。@Donal,不,我不明白他在评论中说了什么。你能告诉我这个xml配置的java配置等价物是什么吗?
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);
    }

}
       try{
    Class c= Class.forName("A"); // A - className
    Constructor c1[]=c.getDeclaredConstructors();
    c1[0].setAccessible(true);
    A a= (A)c1[0].newInstance();
    }
    catch (Exception e){
        e.printStackTrace();
    }