← Назад к вопросам

Какие знаешь аннотации для создания Bean?

2.2 Middle🔥 171 комментариев
#Spring Boot и Spring Data#Spring Framework

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Аннотации для создания Bean в Spring

Что такое Bean?

Bean — это объект, управляемый Spring контейнером. Spring создаёт их, хранит и внедряет в нужные места.

1. @Bean (наиболее универсальная)

@Bean используется в классах с @Configuration для явного определения beans.

@Configuration
public class AppConfig {
    
    // Простой bean
    @Bean
    public UserRepository userRepository() {
        return new UserRepository();
    }
    
    // Bean с именем
    @Bean(name = "customRepository")
    public UserRepository customUserRepository() {
        return new UserRepository();
    }
    
    // Bean с инициализацией и cleanup
    @Bean(initMethod = "init", destroyMethod = "close")
    public DatabaseConnection databaseConnection() {
        return new DatabaseConnection();
    }
    
    // Bean с зависимостями от других beans
    @Bean
    public UserService userService(UserRepository repository) {
        // Spring автоматически внедрит repository
        return new UserService(repository);
    }
    
    // Bean с условиями
    @Bean
    @ConditionalOnProperty(name = "app.cache.enabled", havingValue = "true")
    public CacheManager cacheManager() {
        return new CacheManager();
    }
}

Когда использовать:

  • Для третьих библиотек (нельзя добавить аннотацию на их класс)
  • Для сложной конфигурации
  • Для явного управления созданием

2. @Component

@Component — универсальная аннотация для всех beans.

@Component
public class UserRepository {
    public User findById(Long id) {
        // implementation
    }
}

@Component("customRepository")  // Можно задать имя
public class CustomUserRepository extends UserRepository {
    // implementation
}

// Использование
@Component
public class UserService {
    private UserRepository repository;
    
    @Autowired
    public UserService(UserRepository repository) {
        this.repository = repository;
    }
}

Когда использовать: для обычных классов в твоём проекте.

3. @Service

@Service — специализированная @Component для service слоя (business logic).

@Service
public class UserService {
    private UserRepository repository;
    private EmailService emailService;
    
    @Autowired
    public UserService(UserRepository repository, EmailService emailService) {
        this.repository = repository;
        this.emailService = emailService;
    }
    
    public User registerUser(String email, String password) {
        User user = new User(email, password);
        repository.save(user);
        emailService.sendWelcomeEmail(email);
        return user;
    }
    
    public User updateUser(User user) {
        return repository.save(user);
    }
}

@Service("userServiceV2")  // Можно задать имя
public class UserServiceV2 implements UserService {
    // Другая реализация
}

Когда использовать: для классов с business logic.

4. @Repository

@Repository — специализированная @Component для слоя доступа к данным.

@Repository
public class UserRepository {
    
    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    public User findById(Long id) {
        String sql = "SELECT * FROM users WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{id}, 
            new BeanPropertyRowMapper<>(User.class));
    }
    
    public void save(User user) {
        String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
        jdbcTemplate.update(sql, user.getName(), user.getEmail());
    }
    
    public void delete(Long id) {
        String sql = "DELETE FROM users WHERE id = ?";
        jdbcTemplate.update(sql, id);
    }
}

// С Spring Data JPA
@Repository
public interface UserJpaRepository extends JpaRepository<User, Long> {
    User findByEmail(String email);
    List<User> findByNameContaining(String name);
}

Когда использовать: для классов доступа к данным (DAO).

5. @Controller

@Controller — аннотация для веб-контроллеров (MVC).

@Controller
@RequestMapping("/users")
public class UserController {
    
    @Autowired
    private UserService userService;
    
    @GetMapping("/{id}")
    public String getUser(@PathVariable Long id, Model model) {
        User user = userService.findById(id);
        model.addAttribute("user", user);
        return "user-detail";  // Возвращает view
    }
    
    @PostMapping
    public String createUser(@ModelAttribute User user) {
        userService.save(user);
        return "redirect:/users";
    }
}

Когда использовать: для обработки HTTP запросов и возврата HTML views.

6. @RestController

@RestController — @Controller + @ResponseBody (для REST API).

@RestController
@RequestMapping("/api/users")
public class UserRestController {
    
    @Autowired
    private UserService userService;
    
    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.findById(id);  // Автоматически JSON
    }
    
    @PostMapping
    public User createUser(@RequestBody User user) {
        return userService.save(user);
    }
    
    @PutMapping("/{id}")
    public User updateUser(@PathVariable Long id, @RequestBody User user) {
        user.setId(id);
        return userService.save(user);
    }
    
    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable Long id) {
        userService.delete(id);
    }
}

Когда использовать: для REST API endpoints.

7. @Configuration

@Configuration — для классов, которые содержат @Bean определения.

@Configuration
public class DataSourceConfig {
    
    @Bean
    public DataSource dataSource() {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:postgresql://localhost:5432/mydb");
        config.setUsername("user");
        config.setPassword("password");
        config.setMaximumPoolSize(20);
        return new HikariDataSource(config);
    }
    
    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

@Configuration
public class SecurityConfig {
    
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .antMatchers("/public/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .formLogin();
        return http.build();
    }
}

Когда использовать: для конфигурации и создания сложных beans.

Сравнение аннотаций

// Простой класс — используй @Component
@Component
public class SimpleClass {
}

// Business logic — используй @Service
@Service
public class OrderService {
}

// Доступ к БД — используй @Repository
@Repository
public class OrderRepository {
}

// Веб controller (HTML) — используй @Controller
@Controller
public class PageController {
}

// API controller (JSON) — используй @RestController
@RestController
public class ApiController {
}

// Третья библиотека или сложная логика — используй @Bean в @Configuration
@Configuration
public class ThirdPartyConfig {
    @Bean
    public ExternalService externalService() {
        return new ExternalService();
    }
}

Автоматический поиск beans (@ComponentScan)

@Configuration
@ComponentScan({"com.example.service", "com.example.repository"})
public class AppConfig {
    // Spring будет искать @Component, @Service, @Repository в этих пакетах
}

// Spring Boot автоматически сканирует пакет приложения и все подпакеты
@SpringBootApplication
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}

Практический пример: полный стек

// 1. Entity
public class User {
    private Long id;
    private String email;
    private String password;
    // getters and setters
}

// 2. Repository слой
@Repository
public class UserRepository {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    public User findById(Long id) {
        String sql = "SELECT * FROM users WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{id},
            new BeanPropertyRowMapper<>(User.class));
    }
    
    public void save(User user) {
        String sql = "INSERT INTO users (email, password) VALUES (?, ?)";
        jdbcTemplate.update(sql, user.getEmail(), user.getPassword());
    }
}

// 3. Service слой
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
    
    @Autowired
    private EmailService emailService;
    
    public User registerUser(String email, String password) {
        User user = new User();
        user.setEmail(email);
        user.setPassword(password);  // На практике нужно хешировать!
        userRepository.save(user);
        
        emailService.sendWelcomeEmail(email);
        return user;
    }
    
    public User getUser(Long id) {
        return userRepository.findById(id);
    }
}

// 4. REST Controller
@RestController
@RequestMapping("/api/users")
public class UserController {
    @Autowired
    private UserService userService;
    
    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.getUser(id);
    }
    
    @PostMapping
    public User registerUser(@RequestBody UserRegistrationDto dto) {
        return userService.registerUser(dto.getEmail(), dto.getPassword());
    }
}

// 5. Конфигурация
@Configuration
public class DatabaseConfig {
    @Bean
    public DataSource dataSource() {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:postgresql://localhost:5432/mydb");
        config.setUsername("user");
        config.setPassword("password");
        return new HikariDataSource(config);
    }
    
    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

// 6. Spring Boot Application
@SpringBootApplication
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
        // Spring автоматически создаёт все beans и внедряет зависимости
    }
}

Выводы

АннотацияНазначениеКогда использовать
@BeanЯвное определение beanТретьи библиотеки, сложная логика
@ComponentУниверсальный beanЛюбой класс, если ничего подходящего
@ServiceBean для бизнес-логикиService слой
@RepositoryBean для доступа к даннымDAO, Database access
@ControllerMVC контроллерВозврат HTML views
@RestControllerREST контроллерREST API endpoints (JSON)
@ConfigurationКонфигурация с @BeanКонфигурационные классы

Иерархия: @Service, @Repository, @Controller, @RestController все наследуют @Component

Spring Boot: автоматически сканирует пакеты и создаёт beans на основе аннотаций