Come creare istanze on the fly in CDI

Supponiamo che ho un Auto di classe. Nel mio codice ho voglia di creare 10 macchine. Auto di classe ha qualche @Inject annotata dipendenze. Quale sarebbe l’approccio migliore per fare questo?

CDI dispone di un Provider di interfaccia che posso utilizzare per creare l’auto:

@Inject Provider<Car> carProvider;
public void businessMethod(){
    Car car = carProvider.get();
}

Purtroppo che non funziona se non ho un CarFactory che dispone di un metodo con @Produce annotazione che crea l’auto. Per quanto riflette il mondo reale che non riesco a creare vetture senza una fabbrica, preferisco non scrivere fabbriche per tutto. Voglio solo CDI contenitore per creare la mia auto proprio come qualsiasi altro bean. Come mi consiglia di creare quelle Auto?

InformationsquelleAutor palto | 2013-02-25

 

4 Replies
  1. 10

    Basta usare javax.enterprise.iniettare.Esempio di interfaccia, invece.

    Come questo:

    public class Bean {
    
        private Instance<Car> carInstances;
    
        @Inject
        Bean(@Any Instance<Car> carInstances){
            this.carInstances = carInstances;
        }
    
        public void use(){
            Car newCar = carInstances.get();
            //Do stuff with car ...
        }
    
    }
    • Questo è in realtà quello che ho finito per usare. Potrebbe risolvere il tuo esempio, l’argomento del costruttore non è lo stesso tipo dell’attributo di classe: Auto vs UIModule. Anche io penso che l’iniezione deve essere annotetade con @di Nuovo, invece di @Eventuali. E un esempio migliore per l’utilizzo()-metodo sarebbe quello che vorresti mostrare come si potrebbe ottenere un’istanza della Vettura. Per esempio carInstances.get()
    • è deprecato in CDI 1.1, in preferenza di @Dipendente fagioli. Vedere CDI 1.1, sezione 3.14. Io non capisco davvero cosa c’è di sbagliato con l’utilizzo di un provider, ho. e., CDI.current().select(Car.class).get() ?
    • Il problema è che ho dovuto creare una fabbrica per l’uso di un fornitore di servizi. L’esempio che hai fornito nel commento è del tutto nuovo per me. Forse si potrebbe creare una risposta da esso?
    • Così ho fatto…….
  2. 7

    Mio modello preferito per programmatico di ricerca è quello di utilizzare CDI.current().select().get().

    Dimostrato qui.

    Servlet è una dipendenza su due CDI fagioli, una richiesta di ambito e le altre scope di applicazione:

    private final RequestScopedBean requestScoped
                = CDI.current().select(RequestScopedBean.class).get();
    
    private final ApplicationScopedBean applicationScoped
                = CDI.current().select(ApplicationScopedBean.class).get();

    La classe di test che utilizza questa servlet può essere trovato qui.

    Esaminare il codice, e si noterà che il codice è completamente equivalente a quella che si ottiene con @Inject MyBean myBean;.

  3. 3

    Si potrebbe utilizzare qualificazioni con il vostro @Produce annotazioni:

    @Qualifier
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.METHOD, ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER})
    public @interface MyCars {
    }

    campione-produttore-metodo:

    @Produces
    @MyCars
    public Car getNewCar(@New Car car){
        return car;
    }

    uso:

    @Inject
    @MyCars
    private Provider<Car> carProvider;
    • ‘@New è deprecato in CDI 1.1, in preferenza di @Dipendente fagioli. Vedere CDI 1.1, sezione 3.14.
    • lo so, ma come tempo di risposta CDI 1.1 non era fuori, quindi la risposta va al CDI 1.0 (giusto per chiarire questo qui)
  4. 0

    Un altro modo per farlo sarebbe quello di semplice non dare Auto CDI ambito, che la rende dipendente e si otterrà una nuova istanza ogni volta che viene iniettato e quelle istanze non essere distrutto finché l’contenente istanza è distrutto.

    • l’ambito non è qualcosa di cui preoccuparsi, in quanto ho capito che voleva avere un iniettato produttore e non dover implementare un produttore specifico di classe. Hai ragione, che tutti iniettato cdi-i fagioli diventano @dependent, ma non è quello che palto stava parlando
    • “una nuova istanza ogni volta che viene iniettato”? Come può un dipendente di essere iniettato “ogni volta”? L’iniezione avviene solo una volta. Di un proxy. Se un @Dipendente bean, o un proxy, è stato iniettato, quindi ad ogni chiamata proxy saranno sempre indirizzati ad uno stesso backing bean.
    • Inserisce il proxy una volta, sì, ma se il proxy risolve un dipendente ambito bean, quindi, che dipende ambito bean è creato di nuovo su ogni nuova istanza del bean richiede l’iniezione. Iniettato bean diventa dipendente dal ciclo di vita di altri.

Lascia un commento