0Pricing
Java Academy · Lekcja

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

  1. Autokonfiguracja i startery Spring Boot
  2. Właściwości aplikacji i profile
  3. Wiązanie beanów: @Component, @Service, @Repository
  4. Wstrzykiwanie przez konstruktor i zależności cykliczne
← Powrót do Java Academy