Java Spring bean с частным конструктором

Возможно ли в Spring, что класс для bean не имеет открытого конструктора, а только private? Будет ли этот частный конструктор вызываться при создании 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, а не против ограничений видимости.