Introducció
La injecció de dependències és un concepte fonamental en el desenvolupament d'aplicacions amb Spring Boot. Permet gestionar les dependències entre els components de l'aplicació de manera eficient i flexible, facilitant la creació de codi modular i fàcil de mantenir.
Conceptes clau
- Inversió de control (IoC): Principi de disseny que inverteix el control del flux del programa des del codi personalitzat a un contenidor o marc.
- Injecció de dependències (DI): Procés de proporcionar les dependències necessàries a un objecte en lloc de crear-les dins de l'objecte mateix.
- Contenidor de Spring: Gestiona el cicle de vida dels beans (objectes gestionats per Spring) i les seves dependències.
Tipus d'injecció de dependències
- Injecció per constructor: Les dependències es passen a través del constructor de la classe.
- Injecció per setter: Les dependències es passen a través de mètodes setter.
- Injecció de camp: Les dependències es passen directament als camps de la classe.
Exemples pràctics
Injecció per constructor
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class ProductService { private final ProductRepository productRepository; @Autowired public ProductService(ProductRepository productRepository) { this.productRepository = productRepository; } public List<Product> getAllProducts() { return productRepository.findAll(); } }
Explicació:
@Service
: Marca la classe com un servei gestionat per Spring.@Autowired
: Indica a Spring que injecti la dependènciaProductRepository
al constructor deProductService
.
Injecció per setter
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class OrderService { private OrderRepository orderRepository; @Autowired public void setOrderRepository(OrderRepository orderRepository) { this.orderRepository = orderRepository; } public List<Order> getAllOrders() { return orderRepository.findAll(); } }
Explicació:
@Autowired
al mètode settersetOrderRepository
indica a Spring que injecti la dependènciaOrderRepository
.
Injecció de camp
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class CustomerService { @Autowired private CustomerRepository customerRepository; public List<Customer> getAllCustomers() { return customerRepository.findAll(); } }
Explicació:
@Autowired
al campcustomerRepository
indica a Spring que injecti la dependència directament al camp.
Exercicis pràctics
Exercici 1: Injecció per constructor
Crea una classe UserService
que depengui de UserRepository
utilitzant la injecció per constructor.
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserService { private final UserRepository userRepository; @Autowired public UserService(UserRepository userRepository) { this.userRepository = userRepository; } public List<User> getAllUsers() { return userRepository.findAll(); } }
Exercici 2: Injecció per setter
Crea una classe PaymentService
que depengui de PaymentRepository
utilitzant la injecció per setter.
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class PaymentService { private PaymentRepository paymentRepository; @Autowired public void setPaymentRepository(PaymentRepository paymentRepository) { this.paymentRepository = paymentRepository; } public List<Payment> getAllPayments() { return paymentRepository.findAll(); } }
Exercici 3: Injecció de camp
Crea una classe InvoiceService
que depengui de InvoiceRepository
utilitzant la injecció de camp.
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class InvoiceService { @Autowired private InvoiceRepository invoiceRepository; public List<Invoice> getAllInvoices() { return invoiceRepository.findAll(); } }
Errors comuns i consells
- No oblidar
@Autowired
: Assegura't d'anotar correctament els constructors, setters o camps amb@Autowired
. - Circular dependencies: Evita les dependències circulars, ja que poden causar errors en el moment de la injecció.
- Utilitza final per a dependències injectades per constructor: Això ajuda a assegurar que les dependències no es modifiquin després de la injecció.
Conclusió
La injecció de dependències és una tècnica poderosa que facilita la gestió de les dependències entre els components de l'aplicació. Amb Spring Boot, pots utilitzar diferents tipus d'injecció segons les teves necessitats, millorant la modularitat i mantenibilitat del teu codi. Practica els exemples i exercicis proporcionats per consolidar els teus coneixements sobre aquest tema essencial.
Curs de Spring Boot
Mòdul 1: Introducció a Spring Boot
- Què és Spring Boot?
- Configuració del teu entorn de desenvolupament
- Creant la teva primera aplicació Spring Boot
- Entenent l'estructura del projecte Spring Boot
Mòdul 2: Conceptes bàsics de Spring Boot
- Anotacions de Spring Boot
- Injecció de dependències a Spring Boot
- Configuració de Spring Boot
- Propietats de Spring Boot
Mòdul 3: Construint serveis web RESTful
- Introducció als serveis web RESTful
- Creant controladors REST
- Gestionant mètodes HTTP
- Gestió d'excepcions en REST
Mòdul 4: Accés a dades amb Spring Boot
- Introducció a Spring Data JPA
- Configuració de fonts de dades
- Creant entitats JPA
- Utilitzant repositoris de Spring Data
- Mètodes de consulta a Spring Data JPA
Mòdul 5: Seguretat a Spring Boot
- Introducció a Spring Security
- Configuració de Spring Security
- Autenticació i autorització d'usuaris
- Implementant autenticació JWT
Mòdul 6: Proves a Spring Boot
Mòdul 7: Funcions avançades de Spring Boot
Mòdul 8: Desplegant aplicacions Spring Boot
Mòdul 9: Rendiment i monitorització
- Optimització del rendiment
- Monitorització amb Spring Boot Actuator
- Utilitzant Prometheus i Grafana
- Gestió de registres i logs