Связывание компонентов: @Component, @Service, @Repository
Используйте стереотипные аннотации, определяйте компоненты с помощью @Bean и разбирайтесь в сканировании компонентов.
«Связывание компонентов: @Component, @Service, @Repository» — бесплатный урок Java Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Стереотипные аннотации
Spring предоставляет стереотипные аннотации, которые помечают классы как компоненты, управляемые Spring, и указывают их роль: @Component (обобщённый компонент), @Service (бизнес-логика), @Repository (доступ к данным), @Controller/@RestController (веб-слой).
@Component: Обобщённый компонент
Любой класс с аннотацией @Component обнаруживается во время сканирования компонентов и регистрируется как компонент Spring. Это основа для всех остальных стереотипов.
@Component
public class EmailFormatter {
public String format(String to, String subject) {
return "To: " + to + "\nSubject: " + subject;
}
}@Service: Слой бизнес-логики
@Service — это специализация @Component, семантически обозначающая сервисный класс. Spring обрабатывает её так же, как @Component, но она передаёт намерение и может использоваться советниками 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: Слой доступа к данным
@Repository помечает классы DAO. Spring добавляет автоматическое преобразование исключений сохранения: SQLException и специфичные для поставщика исключения оборачиваются в иерархию Spring DataAccessException.
@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 в классах @Configuration
Используйте @Bean для метода внутри класса @Configuration, чтобы вручную зарегистрировать компоненты — это удобно для сторонних классов, которые нельзя аннотировать.
@Configuration
public class AppConfig {
@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper().registerModule(new JavaTimeModule());
}
@Bean
public RestTemplate restTemplate() { return new RestTemplate(); }
}Сканирование компонентов
@SpringBootApplication запускает сканирование компонентов, начиная с пакета приложения и проходя по его подпакетам. Классы в подпакетах обнаруживаются автоматически. Используйте @ComponentScan(basePackages=...) для настройки.
// Explicit scan (rarely needed in Spring Boot):
@SpringBootApplication
@ComponentScan(basePackages = {"com.example.app", "com.example.shared"})
public class MyApp { ... }Именование компонентов
По умолчанию имя компонента — это имя класса со строчной первой буквой (OrderService → orderService). Укажите собственное имя: @Service("orders") или @Bean("myMapper").
@Service("orderSvc")
public class OrderService { ... }
// Inject by name:
@Autowired @Qualifier("orderSvc")
private OrderService svc;Области действия компонентов
Область действия по умолчанию — singleton (один экземпляр на контекст Spring). Другие области: prototype (новый экземпляр при каждой инъекции), request, session (только для веб-приложений).
@Service
@Scope("prototype")
public class ReportBuilder {
private List<String> lines = new ArrayList<>();
public void addLine(String line) { lines.add(line); }
}@Primary и @Qualifier для устранения неоднозначности
Если несколько компонентов реализуют один и тот же интерфейс, используйте @Primary, чтобы указать компонент по умолчанию, или @Qualifier("name") в точке инъекции, чтобы выбрать конкретный компонент.
@Service @Primary
public class CacheUserService implements UserService { ... }
@Service
public class DbUserService implements UserService { ... }
// Inject specific one:
@Autowired @Qualifier("dbUserService")
private UserService userService;Ленивая инициализация
По умолчанию компоненты singleton создаются при запуске. Добавьте аннотацию @Lazy, чтобы отложить создание до первого использования — это полезно для дорогих в создании компонентов, которые используются редко.
@Service @Lazy
public class HeavyReportService {
public HeavyReportService() { System.out.println("Created on first use"); }
}@PostConstruct и @PreDestroy
Запускайте логику инициализации после внедрения зависимостей с помощью @PostConstruct. Освобождайте ресурсы перед уничтожением компонента с помощью @PreDestroy.
@Service
public class CacheService {
@PostConstruct
public void init() { System.out.println("Cache warming up..."); }
@PreDestroy
public void cleanup() { System.out.println("Cache cleared."); }
}Быстрая проверка
Какое дополнительное поведение добавляет @Repository по сравнению с @Component?
Итоги
Используйте @Service для бизнес-логики, @Repository для DAO, @Component для вспомогательных компонентов, @Bean для сторонних типов. @Primary/@Qualifier устраняют неоднозначность при выборе компонентов. @PostConstruct/@PreDestroy используются для хуков жизненного цикла.
Часто задаваемые вопросы
Урок «Связывание компонентов: @Component, @Service, @Repository» бесплатный?
Да — полный текст урока «Связывание компонентов: @Component, @Service, @Repository» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Связывание компонентов: @Component, @Service, @Repository»?
Используйте стереотипные аннотации, определяйте компоненты с помощью @Bean и разбирайтесь в сканировании компонентов. Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Связывание компонентов: @Component, @Service, @Repository»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Автонастройка и стартеры Spring Boot
- Свойства приложения и профили
- Связывание компонентов: @Component, @Service, @Repository
- Внедрение через конструктор и циклические зависимости