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.
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.
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.
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é.
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é.
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();
}