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