Sono nuovo in Primavera.Come passare i parametri dinamicamente ai bean Spring
Questo è il codice per la registrazione di fagioli:
<bean id="user" class="User_Imple"> </bean>
<bean id="userdeff" class="User"> </bean>
e questo è il mio classe bean:
public class User_Imple implements Master_interface {
private int id;
private User user; // here user is another class
public User_Imple() {
super();
}
public User_Imple(int id, User user) {
super();
this.id = id;
this.user = user;
}
// some extra functions here....
}
e questo è il mio metodo principale per eseguire l'azione:
public static void main(String arg[]) {
ApplicationContext context = new ClassPathXmlApplicationContext("/bean.xml");
Master_interface master = (Master_interface)context.getBean("user");
// here is my some operations..
int id = ...
User user = ...
// here is where i want to get a Spring bean
User_Imple userImpl; //want Spring-managed bean created with above params
}
Ora voglio chiamare questo costruttore con parametri, e questi parametri sono generati dinamicamente nel mio metho principale ds. Questo è ciò che intendo per passare dinamicamente - non staticamente, come dichiarato nel mio file bean.config
.
Potete per favore citare riferimenti per il motivo per cui 'iniezione setter' è preferibile rispetto costruttore –
"La squadra Primavera sostiene generalmente costruttore iniezione in quanto consente di implementare i componenti dell'applicazione come oggetti immutabili e di garantire che le dipendenze richieste non siano nulle ... L'iniezione di setter deve essere utilizzata principalmente solo per dipendenze opzionali che possono essere assegnate a valori di default ragionevoli all'interno della classe "- http: // docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/beans.html –
Penso che "dinamicamente" l'utente volesse dire passare gli argomenti nel main me Thod, o generalmente al momento di ottenere il fagiolo. chiamare getBean (...) e passare argomenti direttamente funziona, ma spostare questa chiamata a un localizzatore (modello di Service Locator) potrebbe essere fatto per evitare la dipendenza da Spring Framework nel codice. Il localizzatore può essere passato come bean e il localizzatore ApplicationContextAware può chiamare getBean (bean, arg1, arg2 ...). L'ambito del bean dovrebbe essere "prototipo". vedi anche: http://stackoverflow.com/questions/812415/why-is-springs-applicationcontext-getbean-considered-bad –