giannino1995 ha scritto:
A) Non sapevo che le interfacce potessero contenere dei metodi. L'ultimo libro che ho letto riguardava Java 1.7.
Spring 5/Spring Boot 2 richiedono come minimo Java 8. E quindi tutte le nuove feature di Java 8, quali
functional interfaces,
default methods nelle interfacce,
lambda expressions,
method references, Stream API, ecc... le "dovresti" studiare e sapere .... altrimenti (detto in generale) molto avanti non ci vai ...
giannino1995 ha scritto:
Comincio a capire i pezzi che mi mancano. L'uso di Spring Boot prevede delle conoscenze di informatica di base che non ho. E' stata dura ma ora forse ho capito la domanda che devo farti per avere il quadro del discorso. In pratica quello che io non so è il significato di “compilazione”. Non riesco a capire la differenza tra una dipendenza compilata dentro il .war ed una dipendenza non compilata dentro il .war, per me è sempre un software, un modulo, uno strumento per fare qualche cosa e che sta dentro un archivio con estensione .war. Non riesco a capire perché il driver JDBC non possa essere compilato. Non capisco il discorso dell'API JDBC che fa da ponte e forse non ho neppure ben chiaro il concetto di API.
Detto MOLTO in generale, una API è una "interfaccia di programmazione", ovvero tutto quello che un "modulo" (qui in senso molto ampio) è in grado di esporre all'esterno verso altri moduli.
Tutto quello che vedi ad esempio del framework standard qui:
https://docs.oracle.com/en/java/javase/14/docs/api
è la API (come si dice, "pubblica") del framework. Poi nel framework ci sono anche classi/metodi "nascosti". Ad esempio nel package java.lang c'è una classe AbstractStringBuilder, ha il livello default ("package" level), quindi non è visibile all'esterno, la può usare solo il framework. E infatti non è nemmeno documentata nel javadoc. Ecco, questa AbstractStringBuilder non fa parte della API "pubblica" del framework.
Su JDBC, la questione è questa. La API di JDBC sta principalmente nel package java.sql (più poco altro meno noto/usato in javax.sql). JDBC è una API principalmente "interface based", è basata su interfacce. Tutti i tipi più comuni, Connection, Statement, PreparedStatement, ResultSet, ecc.. sono
interfacce. Non le devi ovviamente implementare tu. Le implementa un driver JDBC specifico!
Se usi il Connector/J di MySQL, quando chiedi una Connection, JDBC ti fornisce un oggetto di una classe SPECIFICA dentro il jar del Connector/J ma te lo fa "vedere" solo come java.sql.Connection. Il driver può mettere la classe col nome che vuole, nel package che vuole, scritta come vuole, purché implementi e rispetti la interfaccia.
E tu a livello di applicazione usi solo la API di JDBC, non dovresti importare cose specifiche del driver, tipo:
import com.mysql.cj.jdbc.Blob; // NO
Questa è la classe del Connector/J che implementa java.sql.Blob. Non serve che usi direttamente quella del driver. E questo in sostanza è il motivo per cui è prassi comune mettere la dependency di un driver JDBC con <scope>runtime</scope> .
Quando fai il build del tuo progetto, cioè compili le TUE classi, esse non hanno riferimenti verso quelle classi specifiche, quindi in compilazione il jar del driver NON servirebbe e non verrebbe messo in classpath. Ma ovviamente serve poi a runtime e deve andare a finire in un bundle finale (es. war).
Sarebbe anche un buon campanello di allarme. Se hai importato/usato tipi specifici del driver, il build fallisce. E allora è facile indagare .... "oh .. qualcuno ha referenziato classi del driver(?)" ...
giannino1995 ha scritto:
Non capisco questa parte. Stai dicendo che i progetti che forniscono un .jar devono avere Tomcat in archivio oppure che se lo scope è su provided e l'output e un file .jar il 'provided' funziona come <scope>compile</scope> (mi ritrovo la dipendenza nel .jar)?
Stavo dicendo che se il progetto Spring Boot ha packaging jar ovvero fa una applicazione "standalone", anche se metti "provided" allo starter-tomcat, il Tomcat embedded ce l'hai lo stesso (l'avevo provato).
EDIT: credo di aver capito il perché, mi sono ricordato di una cosa che avevo letto/visto ma verifico appena posso.
giannino1995 ha scritto:
Se però scrivo <optional>false</optional> la dipendenza finisce sul .war e quindi sul server, giusto?
Sì. Comunque
false è il valore predefinito di <optional>, non servirebbe esplicitarlo.
giannino1995 ha scritto:
Gli altri capitoli invece hanno nomi famigliari, penso sia indispensabile leggerli, prima di tutto REST. L'esercitazione che vorrei fare finito il libro è un'applicazione di tipo REST che dovrebbe anche essere una delle più usate in ambito web.
Secondo me puoi ancora leggere il capitolo su REST e quello sulla Security. La Security in generale è "complessa", ci sono molti concetti e approcci (non li conosco tutti nemmeno io ..), quel capitolo ora non ricordo cosa spiega (poi lo rileggo ..) ma sicuramente spiega giusto qualcosa o comunque il minimo indispensabile. Solo per la Security di Spring ci sono interi libri apposta ...
EDIT: mi stavo dimenticando un punto ..
WebFlux NON è stato sostituito da Reactor..... Spring WebFlux USA Reactor. Reactor è lo strato appena sotto.