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

  1. Injecció per constructor: Les dependències es passen a través del constructor de la classe.
  2. Injecció per setter: Les dependències es passen a través de mètodes setter.
  3. 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ència ProductRepository al constructor de ProductService.

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 setter setOrderRepository indica a Spring que injecti la dependència OrderRepository.

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 camp customerRepository 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

Mòdul 2: Conceptes bàsics de Spring Boot

Mòdul 3: Construint serveis web RESTful

Mòdul 4: Accés a dades amb Spring Boot

Mòdul 5: Seguretat a Spring Boot

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ó

Mòdul 10: Millors pràctiques i consells

© Copyright 2024. Tots els drets reservats