Возможно ли в Spring, что класс для bean не имеет открытого конструктора, а только private? Будет ли этот частный конструктор вызываться при создании bean? Спасибо.
Java Spring bean с частным конструктором
Ответ 1
Да, Spring может ссылаться на частные конструкторы. Если он найдет конструктор с правильными аргументами, независимо от видимости, он будет использовать отражение, чтобы его конструктор был доступен.
Ответ 2
Вы всегда можете использовать метод factory для создания beans вместо того, чтобы полагаться на конструктор по умолчанию, из контейнер IoC: активация с использованием экземпляра factory:
<!-- 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, а также могут быть введены зависимости для метода factory bean.
Ответ 3
Да, частные конструкторы вызываются 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 вызывает частный конструктор.
Ответ 4
Обычно у вас есть статический метод factory в таком beans, вы можете указать этот метод для spring, чтобы получить экземпляр этого bean. См. 3.3.1.3 здесь. Это рекомендуется для Spring, а не против ограничений видимости.