在Spring中,一个bean的类是否可以没有公共构造函数,只有一个私有构造函数呢?
当创建bean时,这个私有构造函数会被调用吗?
是的,Spring可以调用私有构造函数。如果它找到了具有正确参数的构造函数,无论其可见性如何,它都将使用反射来设置其构造函数为可访问。
您可以始终使用工厂方法创建bean,而不是依赖于默认构造函数,引用自IoC容器:使用实例工厂方法进行实例化:
<!-- 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的依赖关系注入。
是的,私有构造函数可以被Spring调用。
考虑下面的代码:
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可以访问私有构造函数。它会在内部像下面的代码一样工作。
try {
Class clazz = Class.forName("A"); // A - Fully qualified class name
Constructor constructor[] = clazz.getDeclaredConstructors();
constructor[0].setAccessible(true);
A a = (A) constructor[0].newInstance();
}
catch (Exception e) {
e.printStackTrace();
}
Spring框架不会将私有构造函数作为Bean范围调用。如果这样做,将会抛出以下错误。
导致此问题的常见原因包括使用final类或非可见类。嵌套异常为
java.lang.IllegalArgumentException: 类中没有可见的构造函数。