Java Spring Angular RXJS Singls Kafka
Java Spring Angular RXJS Singls Kafka
🔸 Java 8 (2014)
Pourquoi ? :
o Approche fonctionnelle = code plus concis.
o Streams permettent de manipuler les collections de manière déclarative.
🔸 Java 11 (2018)
Pourquoi ? :
o HttpClient plus moderne, supporte asynchrone.
o var améliore la lisibilité dans les méthodes complexes.
Thread.startVirtualThread(() -> {
System.out.println("Running in virtual thread");
});
Pourquoi ? :
o Concurrence massive à moindre coût.
o Remplace ExecutorService classique dans les applications réactives.
Nouveautés :
o Support du paradigme réactif (WebFlux).
o Intégration avec Java 8 (Optional, Streams, CompletableFuture).
o Compatibilité avec JDK 9+.
Use Case :
o Application réactive non bloquante avec Mono et Flux.
@GetMapping("/user")
public Mono<User> getUser() {
return userService.findByIdAsync();
}
Pourquoi ? :
o Optimisation des ressources pour les applications à forte charge (ex: services de
streaming).
🔸 Spring 6 (2022)
Nouveautés :
o Support natif de GraalVM (AOT compilation).
o Nécessite Java 17+ et Jakarta EE 9+ (javax → jakarta).
o API sécurisée via ProblemDetail et gestion centralisée des erreurs.
Use Case :
o Microservice léger compilé en natif avec GraalVM pour startup rapide.
Pourquoi ? :
o Permet d'atteindre des objectifs Cloud-Native : rapidité, faible empreinte
mémoire.
Spring Boot 2.7 : dernière version compatible avec Spring 5 et Java 8-11.
Spring Boot 3.0+ : basé sur Spring 6, Java 17+, Jakarta EE 9+.
Fonctionnalités clés :
o Démarrage rapide (@SpringBootApplication), autoconfiguration.
o Actuator (monitoring), DevTools, profils (application-{profile}.yml).
o Starter dependencies (ex: spring-boot-starter-web, -data-jpa, etc.)
Use Case :
@RestController
@RequestMapping("/api")
public class ProductController {
@GetMapping("/products")
public List<Product> all() {
return productRepository.findAll();
}
}
Pourquoi ? :
o Moins de configuration manuelle → gain de temps.
o Structuration rapide de microservices ou APIs REST.
Authentication vs Authorization :
o Authentication = prouver l'identité.
o Authorization = accès aux ressources.
Filter Chain : enchaînement de filtres qui interceptent les requêtes HTTP.
SecurityContext : contient les détails de l’utilisateur connecté (Authentication).
GrantedAuthority : rôles/permissions.
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin();
}
}
🔸 Pourquoi ?
Sécurité robuste et configurable à tous les niveaux.
Intégration native avec OAuth2 / JWT / LDAP.
Personnalisation facile pour rôles, endpoints, CORS, CSRF, etc.
Nouvelle API (Spring 6) plus lisible, moins verbeuse.
But : Simplifier l'accès aux données via des interfaces sans implémentation explicite.
Exemple :
Pourquoi ? :
o Pas besoin d’écrire de requêtes SQL ou JPQL pour les opérations courantes.
o Génération dynamique des requêtes à partir du nom de la méthode.
🔸 JPA vs Hibernate
🔸 EntityManager
@PersistenceContext
private EntityManager em;
Pourquoi ? :
o Contrôle fin sur les requêtes et le cycle de vie des entités.
🔸 Pourquoi ?
🔸 OpenAPI (ex-Swagger)
🔸 Mockito
@Mock
UserService userService;
@Test
void testUser() {
when(userService.getName()).thenReturn("Ala");
assertEquals("Ala", userService.getName());
}
Feature: Login
Scenario: Successful login
Given user is on login page
When they enter valid credentials
Then they see the dashboard
🔸 Pourquoi ?
Testabilité, maintenabilité.
Facile à remplacer une technologie sans toucher à la logique métier.
🔸 Exemple :
interface UserRepositoryPort {
User findById(Long id);
}
class UserService {
UserRepositoryPort port;
// logique métier
}
🔸 Microservices : Concepts & Patterns
🔸 Patterns courants :
🔸 Use Case
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'mvn clean install'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
}
}
}
🔸 Docker
🔸 Pourquoi ?
Tout cela permet une architecture moderne, modulaire, testable et facilement déployable dans un
contexte cloud/microservices.
🔹 Angular : RxJS, Signals, Binding, Pipes, Directives
🔸 RxJS
this.http.get('/api/users').pipe(map(data =>
data.name)).subscribe(console.log);
Pourquoi ? :
o Remplace BehaviorSubject, ReplaySubject dans certains cas.
o Meilleure lisibilité, pas de subscribe/unsubscribe.
🔸 Data Binding
One-way : [value]="user.name"
Two-way : [(ngModel)]="user.name"
🔸 Pipes
{{ birthday | date:'shortDate' }}
Custom Pipe :
@Pipe({name: 'capitalize'})
export class CapitalizePipe implements PipeTransform {
transform(value: string): string {
return value.charAt(0).toUpperCase() + value.slice(1);
}
}
🔸 Directives
Structurelles : *ngIf, *ngFor
Attributs : [ngClass], [ngStyle]
Custom Directive :