CDI ha la funzione di Specialization, e lo sto cercando nel mondo primaverile.@Specializza in primavera
Dettagli. In CDI, l'annotazione @Specializes
consente di modificare il comportamento di un bean semplicemente sovrascrivendolo. Ciò è completamente trasparente per gli utenti di quel bean, ad es. Se avessimo
public class OneBean {
public String whoAmI() { return "OneBean"; }
}
@Specializes
public class AnotherBean extends OneBean {
@Override
public String whoAmI() { return "AnotherBean"; }
}
potremmo
public class SomewhereElse {
@Inject
OneBean oneBean; // we know nothing of AnotherBean here!
public void guessWhosThere() {
return oneBean.whoAmI(); // yet it returns "AnotherBean"
}
}
Questo diventa molto utile non appena OneBean
viene effettivamente utilizzato con e senza AnotherBean
. Ad esempio, se OneBean
è in one.jar
e AnotherBean
è in another.jar
, è possibile modificare il comportamento del bean solo riconfigurando il classpath.
Domanda. Esiste qualcosa come la specializzazione anche in primavera?
sono riuscito a trovare solo la @Primary
annotazione, che ha però una semantica diversa: @Primary
non sostituisce un fagiolo, ma segna solo uno dei molteplici alternative come il primario uno. Soprattutto, come ho capito, non sono riuscito a costruire una gerarchia di eredità profonda come è possibile con @Specializes
.
Cosa ti impedisce di modificare la firma in 'classe pubblica astratta OneBean'? Concettualmente non è così ovvio, ma se capisco 'Specializes' correttamente, sembra che tu abbia la stessa funzionalità. – Floegipoky
Sì, hai ragione: nell'esempio dato, potevo semplicemente rendere astratto 'OneBean'. Tuttavia, a quanto pare, non avrei nemmeno bisogno di '@ Specializza' in questo caso. L'annotazione diventa davvero utile non appena si usa effettivamente 'OneBean', ad esempio in' one.jar', e 'AnotherBean' potrebbe cambiarne il comportamento, ad esempio non appena' another.jar' (contenente 'AnotherBean') è nel classpath. – fxnn