Mai usato @Autowired, tendo a come utilizzare i parametri nei costruttori ma a volte è difficile capire cosa significano i parametri, specialmente se si hanno molti parametri - in tal caso, preferisco usare l'approccio "Builder" descritto in Effective Java. Il costruttore riceve l'oggetto build (che ha setter) e si costruisce con esso. Gli attributi iniettati della classe sono finali (immutabilità), la classe "Builder" contiene setter ma non getter (non ha bisogno di come la dichiariamo come una classe interna della classe che viene costruita), e nessun setter ha bisogno ad essere creato solo per la primavera:
<bean id="runnable" class="MyClass">
<constructor-arg>
<bean class="MyClass$Builder">
<property name="p1" value="p1Value"/>
<property name="p2" value="p2Value"/>
<property name="p3" value="p3Value"/>
<property name="p4" value="p4Value"/>
</bean>
</constructor-arg>
</bean>
codice classe:
public class MyClass {
private final String p1;
private final String p2;
private final String p3;
private final String p4;
public MyClass(Builder builder) {
this.p1 = builder.p1;
this.p2 = builder.p2;
this.p3 = builder.p3;
this.p4 = builder.p4;
}
...
public static class Builder {
private String p1;
private String p2;
private String p3;
private String p4;
public void setP1(String p1) {
this.p1 = p1;
}
... and so on
}
}
fonte
2009-06-18 19:18:14
Questa risposta implica che "codifica per interfacce" significa che ogni classe deve implementare un'interfaccia separata. Questo non è ciò che il principio, come descritto nel libro GoF, significa. In realtà, si applica solo ai casi in cui è necessario o già in uso due tipi di oggetto distinti, uno per l'astrazione (interfaccia) e un altro per un'implementazione di tale astrazione. –
Penso che sia probabile che le classi che devono essere iniettate l'una nell'altra in una comune applicazione Spring siano classi ** service **, come 'Dao's ecc. Ho scoperto che un gran numero di queste potrebbe presumibilmente hanno implementazioni alternative –
Sì, quando si hanno più implementazioni si applica il principio "codice per l'interfaccia, non per l'implementazione". Ma dire cose come "se si codifica per interfacce ..." senza un chiaro contesto è fuorviante e può essere facilmente interpretato male da sviluppatori meno esperti.L'uso eccessivo di interfacce separate provoca gravi danni, IMO. –