Какие знаешь классы для конфигурации контейнера?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Классы для конфигурации контейнера в Spring
Конфигурация контейнера Spring - это процесс определения бинов, их зависимостей и жизненного цикла. Существует несколько подходов.
1. ApplicationContext
Основной интерфейс контейнера Spring:
// AnnotationConfigApplicationContext - для Java config
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = context.getBean(UserService.class);
// ClassPathXmlApplicationContext - для XML config
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// FileSystemXmlApplicationContext - XML из файловой системы
ApplicationContext context = new FileSystemXmlApplicationContext("/etc/config.xml");
2. BeanFactory
Базовый интерфейс для управления бинами:
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
UserService userService = (UserService) factory.getBean("userService");
ApplicationContext расширяет BeanFactory и добавляет дополнительный функционал.
3. @Configuration класс
Java-based конфигурация вместо XML:
@Configuration
public class AppConfig {
@Bean
public DataSource dataSource() {
return new HikariDataSource();
}
@Bean
public UserRepository userRepository(DataSource dataSource) {
return new JdbcUserRepository(dataSource);
}
@Bean
public UserService userService(UserRepository userRepository) {
return new UserService(userRepository);
}
}
4. @ComponentScan
Автоматическое обнаружение бинов:
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
// Найдёт все классы с @Component, @Service, @Repository
}
@Service
public class UserService {
// Будет автоматически создан как бин
}
@Repository
public class UserRepository {
// Будет автоматически создан как бин
}
5. @Bean аннотация
Явное определение бина в @Configuration:
@Configuration
public class AppConfig {
@Bean(name = "userService")
public UserService userService() {
return new UserService();
}
@Bean
@Scope("prototype") // Новый экземпляр каждый раз
public UserDTO userDTO() {
return new UserDTO();
}
@Bean
@Conditional(OnEnvironmentCondition.class)
public PaymentService paymentService() {
return new PaymentService();
}
}
6. PropertySource и Environment
Управление конфигурационными свойствами:
@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig {
@Value("${app.name}")
private String appName;
@Bean
public AppSettings appSettings(Environment env) {
String dbUrl = env.getProperty("database.url");
String dbUser = env.getProperty("database.user");
return new AppSettings(dbUrl, dbUser);
}
}
7. Import аннотация
Импорт других конфиг классов:
@Configuration
public class DataConfig {
@Bean
public DataSource dataSource() {
return new HikariDataSource();
}
}
@Configuration
@Import(DataConfig.class)
public class AppConfig {
// Импортирует все бины из DataConfig
}
8. Conditional аннотация
Условное создание бинов:
@Configuration
public class AppConfig {
@Bean
@ConditionalOnProperty(name = "feature.enabled", havingValue = "true")
public FeatureService featureService() {
return new FeatureService();
}
@Bean
@ConditionalOnMissingBean
public DefaultCache defaultCache() {
return new DefaultCache();
}
}
9. BeanFactoryPostProcessor
Модификация определения бинов перед их созданием:
@Component
public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
BeanDefinition def = beanFactory.getBeanDefinition("userService");
def.setScope(BeanDefinition.SCOPE_SINGLETON);
}
}
10. BeanPostProcessor
Обработка бинов после создания:
@Component
public class LoggingBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
System.out.println("Creating bean: " + beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
System.out.println("Bean created: " + beanName);
return bean;
}
}
11. FactoryBean
Создание бинов через фабрику:
public class UserServiceFactoryBean implements FactoryBean<UserService> {
@Override
public UserService getObject() throws Exception {
return new UserService(); // Кастомная логика создания
}
@Override
public Class<?> getObjectType() {
return UserService.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
@Configuration
public class AppConfig {
@Bean
public UserServiceFactoryBean userServiceFactoryBean() {
return new UserServiceFactoryBean();
}
// Использование
@Bean
public void processUserService(UserService userService) {
// userService будет создан через FactoryBean
}
}
12. InitializingBean и DisposableBean
Управление жизненным циклом бина:
@Component
public class ConnectionPool implements InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet() throws Exception {
// Инициализация (вызывается после установки всех свойств)
initializeConnections();
}
@Override
public void destroy() throws Exception {
// Очистка (вызывается при закрытии контейнера)
closeConnections();
}
}
// Или с аннотациями
@Component
public class AnotherService {
@PostConstruct
public void init() {
System.out.println("Initializing");
}
@PreDestroy
public void cleanup() {
System.out.println("Cleaning up");
}
}
13. Scope аннотация
Определение области видимости бина:
@Configuration
public class AppConfig {
@Bean
@Scope("singleton") // Один экземпляр на всё приложение (default)
public UserService userService() {
return new UserService();
}
@Bean
@Scope("prototype") // Новый экземпляр каждый раз
public UserRequest userRequest() {
return new UserRequest();
}
@Bean
@Scope("request") // Один экземпляр на HTTP request
public RequestContext requestContext() {
return new RequestContext();
}
@Bean
@Scope("session") // Один экземпляр на HTTP session
public UserSession userSession() {
return new UserSession();
}
}
14. Spring Boot автоконфигурация
Spring Boot использует @SpringBootApplication и автоконфигурацию:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
// Это эквивалентно:
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {
}
Best Practices
✓ Используйте Java config вместо XML ✓ Используйте @ComponentScan для автоматического обнаружения ✓ Используйте @Bean для явного определения сложных бинов ✓ Используйте конструктор injection вместо field injection ✓ Используйте @Configuration для логической организации ✓ Используйте @ConditionalOnProperty для конфигурируемого функционала ✓ Минимизируйте логику создания в @Bean методах ✓ Используйте @Profile для разных конфигов per environment ✓ Документируйте зачем каждый бин создаётся ✓ Тестируйте конфигурацию с @SpringBootTest
Правильная конфигурация контейнера - это основа гибкого и масштабируемого приложения.