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