Java Spring bean с приватным конструктором - PullRequest
35 голосов
/ 31 августа 2011

Возможно ли весной, что класс для bean-компонента не имеет открытого конструктора, а только частного? Будет ли этот частный конструктор вызываться при создании бина? Спасибо.

Ответы [ 5 ]

60 голосов
/ 31 августа 2011

Да, Spring может вызывать частные конструкторы.Если он находит конструктор с правильными аргументами, независимо от видимости, он использует отражение, чтобы установить свой конструктор доступным.

3 голосов
/ 19 ноября 2015

Да, частные конструкторы вызываются весной. Посмотрите на мой код:

Файл определения бина:

<bean id="message" class="com.aa.testp.Message">
        <constructor-arg index="0" value="Hi Nice"/>
    </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);
    }

}

Приведенный выше код работает нормально. Следовательно, весна вызвала частного конструктора.

3 голосов
/ 31 августа 2011

Вы всегда можете использовать фабричный метод для создания 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-компонента фабричного метода.

0 голосов
/ 18 августа 2018

Да!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();
    }
0 голосов
/ 31 августа 2011

У таких бинов обычно есть статический метод фабрики, вы можете указать этот метод для весны, чтобы получить экземпляр этого бина.См. 3.3.1.3 здесь. Это способ, рекомендуемый Spring, вместо того, чтобы идти против ограничений видимости.

...