Wiązanie beanów: @Component, @Service, @Repository
Proszę używać adnotacji stereotypowych, definiować beany za pomocą @Bean i zrozumieć skanowanie komponentów.
Wiązanie beanów: @Component, @Service, @Repository to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.
Adnotacje stereotypowe
Spring udostępnia adnotacje stereotypowe, które oznaczają klasy jako beany zarządzane przez Spring i określają ich rolę: @Component (ogólny), @Service (logika biznesowa), @Repository (dostęp do danych), @Controller/@RestController (warstwa internetowa).
@Component: Ogólny bean
Każda klasa opatrzona adnotacją @Component jest wykrywana podczas skanowania komponentów i rejestrowana jako bean Springa. Jest to baza dla wszystkich pozostałych stereotypów.
@Component
public class EmailFormatter {
public String format(String to, String subject) {
return "To: " + to + "\nSubject: " + subject;
}
}@Service: Warstwa logiki biznesowej
@Service jest specjalizacją @Component, która wskazuje semantycznie, że dana klasa jest klasą usługową. Spring traktuje ją tak samo jak @Component, ale przekazuje ona intencję i może być używana przez doradców AOP.
@Service
public class OrderService {
private final OrderRepository repo;
public OrderService(OrderRepository repo) { this.repo = repo; }
public Order placeOrder(Cart cart) { /* business logic */ return repo.save(new Order(cart)); }
}@Repository: Warstwa dostępu do danych
@Repository oznacza klasy DAO. Spring automatycznie tłumaczy wyjątki utrwalania danych: SQLException i wyjątki specyficzne dla dostawcy są opakowywane w hierarchię DataAccessException Springa.
@Repository
public class JdbcUserRepository {
private final JdbcTemplate jdbc;
public JdbcUserRepository(JdbcTemplate jdbc) { this.jdbc = jdbc; }
public User findById(long id) {
return jdbc.queryForObject("SELECT * FROM users WHERE id=?",
new BeanPropertyRowMapper<>(User.class), id);
}
}@Bean w klasach @Configuration
Adnotacji @Bean należy użyć przy metodzie wewnątrz klasy @Configuration, aby ręcznie zarejestrować beany — jest to przydatne w przypadku klas innych firm, których nie można opatrzyć adnotacją.
@Configuration
public class AppConfig {
@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper().registerModule(new JavaTimeModule());
}
@Bean
public RestTemplate restTemplate() { return new RestTemplate(); }
}Skanowanie komponentów
@SpringBootApplication uruchamia skanowanie komponentów od pakietu aplikacji w dół. Klasy w podpakietach są wykrywane automatycznie. Do dostosowania skanowania należy użyć @ComponentScan(basePackages=...).
// Explicit scan (rarely needed in Spring Boot):
@SpringBootApplication
@ComponentScan(basePackages = {"com.example.app", "com.example.shared"})
public class MyApp { ... }Nazewnictwo beanów
Domyślnie nazwa beana jest nazwą klasy zapisaną małą literą na początku (OrderService → orderService). Niestandardową nazwę można określić za pomocą @Service("orders") lub @Bean("myMapper").
@Service("orderSvc")
public class OrderService { ... }
// Inject by name:
@Autowired @Qualifier("orderSvc")
private OrderService svc;Zakresy beanów
Domyślnym zakresem jest singleton (jedna instancja na kontekst Springa). Inne zakresy to: prototype (nowa instancja przy każdym wstrzyknięciu), request i session (tylko w aplikacjach internetowych).
@Service
@Scope("prototype")
public class ReportBuilder {
private List<String> lines = new ArrayList<>();
public void addLine(String line) { lines.add(line); }
}@Primary i @Qualifier — rozstrzyganie niejednoznaczności
Gdy wiele beanów implementuje ten sam interfejs, należy użyć @Primary, aby oznaczyć domyślny bean, albo @Qualifier("name") w punkcie wstrzykiwania, aby wybrać konkretny bean.
@Service @Primary
public class CacheUserService implements UserService { ... }
@Service
public class DbUserService implements UserService { ... }
// Inject specific one:
@Autowired @Qualifier("dbUserService")
private UserService userService;Inicjalizacja opóźniona
Domyślnie beany typu singleton są tworzone podczas uruchamiania. Adnotacja @Lazy odracza ich tworzenie do pierwszego użycia — jest to przydatne w przypadku kosztownych beanów używanych rzadko.
@Service @Lazy
public class HeavyReportService {
public HeavyReportService() { System.out.println("Created on first use"); }
}@PostConstruct i @PreDestroy
Logikę inicjalizacyjną należy uruchamiać po wstrzyknięciu zależności za pomocą @PostConstruct. Zasoby należy zwalniać przed zniszczeniem beana za pomocą @PreDestroy.
@Service
public class CacheService {
@PostConstruct
public void init() { System.out.println("Cache warming up..."); }
@PreDestroy
public void cleanup() { System.out.println("Cache cleared."); }
}Szybkie sprawdzenie
Jakie dodatkowe działanie zapewnia @Repository w porównaniu z @Component?
Podsumowanie
@Service należy stosować do logiki biznesowej, @Repository do DAO, @Component do narzędzi, a @Bean do typów innych firm. @Primary/@Qualifier rozstrzygają konflikty między wieloma beanami. @PostConstruct/@PreDestroy służą do obsługi cyklu życia.
Często zadawane pytania
Czy lekcja „Wiązanie beanów: @Component, @Service, @Repository” jest bezpłatna?
Tak — pełny tekst „Wiązanie beanów: @Component, @Service, @Repository” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wiązanie beanów: @Component, @Service, @Repository”?
Proszę używać adnotacji stereotypowych, definiować beany za pomocą @Bean i zrozumieć skanowanie komponentów. Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Java Academy?
Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Wiązanie beanów: @Component, @Service, @Repository”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?
Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Autokonfiguracja i startery Spring Boot
- Właściwości aplikacji i profile
- Wiązanie beanów: @Component, @Service, @Repository
- Wstrzykiwanie przez konstruktor i zależności cykliczne