Какие знаешь аннотации для создания Bean?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Аннотации для создания 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 | Любой класс, если ничего подходящего |
| @Service | Bean для бизнес-логики | Service слой |
| @Repository | Bean для доступа к данным | DAO, Database access |
| @Controller | MVC контроллер | Возврат HTML views |
| @RestController | REST контроллер | REST API endpoints (JSON) |
| @Configuration | Конфигурация с @Bean | Конфигурационные классы |
Иерархия: @Service, @Repository, @Controller, @RestController все наследуют @Component
Spring Boot: автоматически сканирует пакеты и создаёт beans на основе аннотаций