web-dev-qa-db-fra.com

Haricot Java Spring avec constructeur privé

Est-il possible au printemps que la classe pour le haricot n'ait pas de constructeur public mais uniquement privé? Ce constructeur privé sera-t-il appelé lors de la création du bean? Merci.

33
user710818

Oui, Spring peut appeler des constructeurs privés. S'il trouve un constructeur avec les bons arguments, quelle que soit sa visibilité, il utilisera la réflexion pour que son constructeur soit accessible. 

57
Kevin Stembridge

Vous pouvez toujours utiliser une méthode de fabrique pour créer des beans plutôt que de compter sur un constructeur par défaut, à partir de Le conteneur IoC: Instantiation à l'aide d'une méthode de fabrique d'instance :

<!-- 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"/>

Cela présente l'avantage que vous pouvez utiliser des constructeurs autres que ceux par défaut pour votre bean et que les dépendances pour le bean de la méthode factory peuvent également être injectées.

3
Matthew Farwell

Oui, les constructeurs privés sont appelés par spring . Considérons mon code:

Fichier de définition de haricot:

<bean id="message" class="com.aa.testp.Message">
        <constructor-arg index="0" value="Hi Nice"/>
    </bean>

Classe de haricots:

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);
    }

}

Le code ci-dessus fonctionne bien. Par conséquent, le printemps a invoqué le constructeur privé.

3
Ashish Ani

Vous devriez normalement avoir une méthode d'usine statique dans de tels beans, vous pouvez spécifier cette méthode pour le printemps afin d'obtenir une instance de ce bean. Voir 3.3.1.3 ici. C’est ce qui est recommandé par Spring, au lieu d’aller à l’encontre des restrictions de visibilité.

0
Ashkan Aryan

Oui ! Spring peut accéder au constructeur privé . Il fonctionnera en interne comme ci-dessous le code.

       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
gnana jeyam95