Mechanizm wstrzykiwania zależności jest znany nie tylko w Spring. Zasadniczo są trzy rodzaje wstrzykiwania zależności. Spring pozwala na wykorzystywanie ich wszystkich. Dopuszczalne jest ich stosowanie przemienne. Mimo, że jest to możliwe, to dobre praktyki nie popierają takiemu działaniu. Możliwe jest wstrzykiwanie zależności poprzez:
- Konstruktor
- Pole
- Właściwość
Poniższa klasa jest przykładową, która będzie następnie wstrzykiwana do klasy powiązanej.
@Component public class ShoppingCard { private List<Product> productList; public ShoppingCard() { this.productList = new ArrayList<>(); } public void addProductToShoppingCard(Product product) { productList.add(product); } }
Wstrzykiwanie poprzez konstruktor
Wstrzykiwanie przez konstruktor jest najbardziej rekomendowanym sposobem wstrzykiwania zależności. Odbywa się to poprzez napisaniem adnotacji @Autowired nad konstruktorem, oraz podaniem w parametrze wejściowym klasę która przeznaczona jest do wstrzyknięcia. Całość przedstawia kod poniżej.
@Component public class Shop { private ShoppingCard shoppingCard; @Autowired public Shop(ShoppingCard shoppingCard) { this.shoppingCard = shoppingCard; } public void purchase() { shoppingCard.addProductToShoppingCard(new Product(1, "Milk")); shoppingCard.addProductToShoppingCard(new Product(2, "Tea")); shoppingCard.addProductToShoppingCard(new Product(3, "Bread")); } }
Wstrzykiwanie poprzez pole
Jest to najłatwiejszy sposób wstrzykiwania zależności. Był on wykorzystywany w ramach tego kursu wielokrotnie. Do jego wykorzystania wystarczy nad polem umieścić adnotacje @Autowired. Sposób jest najszybszy i najprostszy do wykorzystania.
@Component public class Shop { @Autowired private ShoppingCard shoppingCard; public void purchase() { shoppingCard.addProductToShoppingCard(new Product(1, "Milk")); shoppingCard.addProductToShoppingCard(new Product(2, "Tea")); shoppingCard.addProductToShoppingCard(new Product(3, "Bread")); } }
Wstrzykiwanie poprzez właściwość
Sposób ten polega na utworzeniu właściwości lub żargonowego setera ustawiającego wartość pola, które przeznaczone jest do wstrzyknięcia. Nad nim musi znajdować się adnotacja @Autowired.
@Component public class Shop { private ShoppingCard shoppingCard; @Autowired public void setShoppingCard(ShoppingCard shoppingCard) { this.shoppingCard = shoppingCard; } public void purchase() { shoppingCard.addProductToShoppingCard(new Product(1, "Milk")); shoppingCard.addProductToShoppingCard(new Product(2, "Tea")); shoppingCard.addProductToShoppingCard(new Product(3, "Bread")); } }
Niezależnie od sposobu wstrzykiwania zależności warto wybrać jedną i kurczowo się nią trzymać w całym projekcie dla utrzymania spójności kodu.
W kolejnym kursie zostanie opisany schemat komunikacji w oparciu o architekturę REST.
Cały kurs opisujący mechanikę i działanie Spring Boot od podstaw znajdziesz tutaj: Kurs Spring Boot