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

Какие знаешь классы для конфигурации контейнера?

1.0 Junior🔥 121 комментариев
#Spring Framework

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

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

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

Классы для конфигурации контейнера в 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

Правильная конфигурация контейнера - это основа гибкого и масштабируемого приложения.

Какие знаешь классы для конфигурации контейнера? | PrepBro