Utilizzo di bean prototype / non-Spring nell'applicazione Spring Web

2

Ho lavorato di recente su poche applicazioni web / servizi web REST (Spring IoC / MVC / Data JPA, ecc.) e di solito seguono lo stesso schema: Classi di controller - > Classi di servizio (che hanno il numero di "utilità" / classi di logica di business autowired) - > Spring Data Repositories.

Praticamente tutte le classi sopra elencate sono singleton di primavera, che a volte mi sembra che faccia il codice e alcune funzioni all'interno di una classe più sporca (ad esempio perché non posso avere uno stato in una classe, ho bisogno di passare parecchio parametri tra i metodi, e non mi piace avere più di 1-2 parametri, anche se a volte ne sono necessari).

Mi chiedevo come superare questo problema nel grande tipo di applicazione (ad esempio l'impresa).

  • È prassi comune utilizzare classi non gestite da Spring nell'applicazione Spring? In tal caso, come si fa a passare delle dipendenze (quelle che normalmente verrebbero autorizzate)? Se per esempio utilizzo l'iniezione del costruttore, allora ho bisogno di autorizzare tutte le dipendenze necessarie nella classe che crea l'oggetto e volevo evitarlo. Inoltre, non voglio davvero scherzare con il tempo di caricamento tessere ecc. Per convertire i bean in oggetti non Spring
  • L'utilizzo dei fagioli con scope prototipo è una buona soluzione? L'unica cosa è che ho bisogno di usare i proxy dell'ambito di AOP (o il metodo di iniezione, ecc.) Per assicurarmi di ottenere una nuova istanza per qualsiasi bean che viene autowired in singleton in primo luogo. Si tratta di un'opzione "pulita" e affidabile - ovvero è certo che non ci saranno problemi di concorrenza e posso comunque autorizzare qualsiasi singleton in quelle classi senza problemi?

Se qualcuno che ha lavorato su un sistema di grandi dimensioni, che in realtà è riuscito a mantenere la struttura non "gonfia" e pulita, ha qualche raccomandazione? Forse ci sono alcuni schemi che non sono a conoscenza e potrebbero usare?

Qualsiasi aiuto apprezzato.

    
posta Zyga 17.01.2016 - 15:04
fonte

1 risposta

2

Ho lavorato a progetti Spring di varie dimensioni, da microservizi di piccole dimensioni (a volte meno di 100 righe di codice di produzione) fino a grandi monoliti (con oltre 20 sviluppatori a tempo pieno che lavorano su base di codice singolo).

Prima di tutto , la mia esperienza è che i monoliti tendono a essere spesso troppo complicati e pieni di complessità accidentale accumulata. Pertanto, se ritieni che il tuo team stia verificando inefficienze causate da codice eccessivo, dovresti prendere in considerazione la possibilità di suddividerlo in componenti più autonomi e gestibili separatamente. Non importa se usi Spring.

In secondo luogo , forse hai riscontrato un movimento di programmazione funzionale che sta prendendo il sopravvento sulla community di alpha geek. Una delle idee fondamentali della programmazione funzionale è la rigorosa separazione tra codice e dati. I programmatori effettivamente funzionanti credono strongmente che sia una pessima idea combinare dati (stato) con il codice in oggetti, come spesso accade nella programmazione orientata agli oggetti.

Personalmente ritengo anche che incapsulare lo stato in un mucchio di oggetti e definire la logica su questi oggetti per mutare questo stato creerà enormi problemi in applicazioni monolitiche. Non importa quanto grandi sviluppatori hai sul progetto, creeranno basi di codice difficili da mantenere, poiché i problemi delle mutazioni di stato sono spesso molto difficili da riprodurre e scoprire.

A tale riguardo, l'ambito Singleton predefinito di Spring rende la base di codice molto più semplice , perché dovresti sempre cercare di non definire alcun stato sui bean singleton . Pensateli solo come un codice, in cui tutti sono rigorosamente privi di stato.

Lo stato nella tua applicazione rappresenta un problema di scalabilità, perché se hai un'applicazione stateful non puoi avere varie istanze di essa. Quindi lo stato dovrebbe essere sempre gestito con cura in cache o depositi dedicati allo stato di archiviazione (ad esempio cache distribuite o griglie di dati o database).

Ora al primo punto elenco , non provare a iniettare bean non Spring nei bean singleton Spring. Lavoro con Spring 5+ anni e posso ricordare solo un caso in cui ho usato lo scope Prototype. Basta creare i tuoi DTO tramite costruttore e non mescolarli con il contesto di Spring. È una buona idea mantenere questi DTO il più possibile. Ciò significa che utilizzare crea solo getter / setter / toString e hashcode / equals per loro se necessario. Consiglio vivamente di utilizzare il progetto Lombok per generare questi metodi standard, in modo che i DTO siano molto leggibili.

Al punto relativo a molti parametri che passano intorno . Basta raggruppare questi parametri in DTO di livello superiore. Per esempio. se si passano i parametri: customerName, customerId, customerCreditCardNumber, basta creare il cliente DTO e trasferirlo. Abbastanza facile Se non vuoi passare nulla, usa l'ambito Richiesta per associare lo stato alla richiesta corrente. Tutti i bean possono autorizzare questo bean dell'ambito della richiesta e mutarne lo stato. Ma questo dovrebbe essere un caso molto raro e eccezionale in quanto potrebbe nascondere spesso comportamenti ingannevoli. È equivalente alla variabile globale per richiesta. Cattiva idea in generale.

Al secondo punto elenco . Credo che fosse già trattato con i miei altri punti.

So che questi approcci stanno deviando significativamente da ciò che abbiamo appreso al college quando l'approccio OOP è stato preferito. Ma l'industria comincia lentamente a rendersi conto che non è il giusto approccio per la scrittura di applicazioni web complesse. Consiglio vivamente di esaminare i principi di programmazione funzionale come sembrano essere il futuro.

    
risposta data 17.01.2016 - 18:00
fonte

Leggi altre domande sui tag