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

Пользовался ли XML-конфигурацией

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

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

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

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

Опыт работы с XML-конфигурацией в Spring

Да, я активно работал с XML-конфигурацией Spring, особенно в ранние годы своей карьеры. Это был стандартный способ конфигурации Spring приложений до появления аннотаций и Java-based конфигурации.

Исторический контекст

В начале 2000-х годов XML была основным способом настройки Spring:

<!-- applicationContext.xml - классический пример -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">
  
  <!-- Определение Bean -->
  <bean id="userRepository" class="com.example.repository.UserRepository">
    <property name="dataSource" ref="dataSource"/>
  </bean>
  
  <bean id="userService" class="com.example.service.UserService">
    <constructor-arg ref="userRepository"/>
    <property name="emailService" ref="emailService"/>
  </bean>
  
  <!-- DataSource конфигурация -->
  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.postgresql.Driver"/>
    <property name="url" value="jdbc:postgresql://localhost:5432/mydb"/>
    <property name="username" value="postgres"/>
    <property name="password" value="password"/>
  </bean>
  
  <!-- Email Service -->
  <bean id="emailService" class="com.example.service.EmailService">
    <property name="mailHost" value="smtp.gmail.com"/>
    <property name="mailPort" value="587"/>
  </bean>
</beans>

Основные методы конфигурации

1. Setter Injection (через property элементы)

<bean id="product" class="com.example.Product">
  <property name="id" value="1"/>
  <property name="name" value="Laptop"/>
  <property name="price" value="999.99"/>
  <property name="category" ref="electronics"/>
</bean>

<bean id="electronics" class="com.example.Category">
  <property name="name" value="Electronics"/>
</bean>

Соответствующий Java код:

public class Product {
  private int id;
  private String name;
  private double price;
  private Category category;
  
  // Setters обязательны
  public void setId(int id) { this.id = id; }
  public void setName(String name) { this.name = name; }
  public void setPrice(double price) { this.price = price; }
  public void setCategory(Category category) { this.category = category; }
}

2. Constructor Injection (через constructor-arg)

<bean id="orderService" class="com.example.service.OrderService">
  <constructor-arg>
    <ref bean="orderRepository"/>
  </constructor-arg>
  <constructor-arg>
    <ref bean="paymentService"/>
  </constructor-arg>
  <constructor-arg>
    <value>100</value>
  </constructor-arg>
</bean>

Java реализация:

public class OrderService {
  private final OrderRepository orderRepository;
  private final PaymentService paymentService;
  private final int maxOrderAmount;
  
  public OrderService(OrderRepository orderRepository, 
                      PaymentService paymentService,
                      int maxOrderAmount) {
    this.orderRepository = orderRepository;
    this.paymentService = paymentService;
    this.maxOrderAmount = maxOrderAmount;
  }
}

Сложные конфигурации

1. Работа с Collections

<bean id="mailConfig" class="com.example.config.MailConfig">
  <!-- List -->
  <property name="recipients">
    <list>
      <value>admin@example.com</value>
      <value>support@example.com</value>
      <value>sales@example.com</value>
    </list>
  </property>
  
  <!-- Map -->
  <property name="properties">
    <map>
      <entry key="smtp.host" value="smtp.gmail.com"/>
      <entry key="smtp.port" value="587"/>
      <entry key="mail.from" value="noreply@example.com"/>
    </map>
  </property>
  
  <!-- Set -->
  <property name="allowedDomains">
    <set>
      <value>example.com</value>
      <value>test.com</value>
    </set>
  </property>
</bean>

2. Namespace и Advanced Features

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation=
         "http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context.xsd
          http://www.springframework.org/schema/tx
          http://www.springframework.org/schema/tx/spring-tx.xsd
          http://www.springframework.org/schema/aop
          http://www.springframework.org/schema/aop/spring-aop.xsd">
  
  <!-- Автоматический поиск компонентов -->
  <context:component-scan base-package="com.example"/>
  
  <!-- Обработка @Transactional аннотаций -->
  <tx:annotation-driven transaction-manager="transactionManager"/>
  
  <!-- AOP для логирования -->
  <aop:aspectj-autoproxy/>
  
  <!-- PropertyPlaceholder для properties файлов -->
  <context:property-placeholder location="classpath:application.properties"/>
  
  <!-- Bean использующий properties -->
  <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
    <property name="jdbcUrl" value="${spring.datasource.url}"/>
    <property name="username" value="${spring.datasource.username}"/>
    <property name="password" value="${spring.datasource.password}"/>
  </bean>
</beans>

Многоуровневая конфигурация

<!-- root-context.xml - для бизнес логики -->
<beans>
  <bean id="userRepository" class="com.example.repository.UserRepository"/>
  <bean id="userService" class="com.example.service.UserService">
    <constructor-arg ref="userRepository"/>
  </bean>
</beans>

<!-- servlet-context.xml - для MVC -->
<beans>
  <bean id="userController" class="com.example.controller.UserController">
    <constructor-arg ref="userService"/>
  </bean>
</beans>

Загрузка в web.xml:

<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>

<servlet>
  <servlet-name>appServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring/servlet-context.xml</param-value>
  </init-param>
</servlet>

Переход на Java-based Configuration

С появлением аннотаций и Java-based конфигурации, XML используется всё реже:

// Современный подход - Java конфигурация
@Configuration
public class AppConfig {
  
  @Bean
  public DataSource dataSource() {
    HikariConfig config = new HikariConfig();
    config.setJdbcUrl("jdbc:postgresql://localhost/mydb");
    config.setUsername("postgres");
    config.setPassword("password");
    return new HikariDataSource(config);
  }
  
  @Bean
  public UserRepository userRepository(DataSource dataSource) {
    return new UserRepository(dataSource);
  }
  
  @Bean
  public UserService userService(UserRepository repository) {
    return new UserService(repository);
  }
}

Мой практический опыт

  • Много лет работал с XML конфигурацией в legacy проектах
  • Поддержка старых приложений, написанных до Java-based конфигурации
  • Миграция проектов с XML на аннотации и Java конфигурацию
  • Профилирование разных методов конфигурации

Когда XML всё ещё используется

  1. Legacy системы — старые Spring приложения
  2. Enterprise стандарты — компании, требующие явной конфигурации
  3. Динамическая конфигурация — когда beans создаются programmatically
  4. Интеграция — специфичные интеграции могут требовать XML

Сравнение подходов

АспектXMLАннотацииJava Config
ЧитаемостьНизкаяВысокаяВысокая
BoilerplateМногоМалоСреднее
Type SafetyНетДаДа
IDE SupportСлабыйОтличныйОтличный
РефакторингСложныйПростойПростой
PerformanceМедленнееБыстрееБыстрее

Хотя я имею глубокий опыт с XML конфигурацией, в современных проектах я предпочитаю Java-based конфигурацию с аннотациями за её простоту, type safety и лучшую IDE поддержку.

Пользовался ли XML-конфигурацией | PrepBro