Что такое конфигурация Bean через XML в Spring?

Ответ

Конфигурация Bean через XML — это классический (legacy) способ определения Spring-бинов и их зависимостей в XML-файлах, а не с помощью аннотаций или Java-конфигурации.

Зачем это нужно? Позволяет конфигурировать приложение без изменения исходного кода (удобно для внешней настройки, подмены реализаций).

Пример файла 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">

    <!-- Определение бина с id и классом -->
    <bean id="myService" class="com.example.MyServiceImpl">
        <!-- Внедрение зависимости через setter -->
        <property name="repository" ref="myRepository"/>
    </bean>

    <bean id="myRepository" class="com.example.MyRepositoryImpl"/>

</beans>

Как загружается:

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
MyService service = context.getBean("myService", MyService.class);

Современная альтернатива: Использование аннотаций (@Component, @Autowired) или Java-based конфигурации (@Configuration).

Ответ 18+ 🔞

Да ты посмотри, какая древность всплыла! XML-конфигурация бинов в Spring, ёпта. Это ж как старый дедовский метод, когда аннотаций ещё и в проекте не было, а все друг другу в applicationContext.xml прописывали, кто на ком стоит.

И зачем этот геморрой, спросишь? А затем, чувак, что можно всю эту шаурму с зависимостями собрать в одном файле, не лезя в сам код. Хочешь — подменил реализацию, херак-херак — и готово, даже перекомпилировать не надо. Удобно для всяких подстановок, когда продакшен от теста отличается, как небо от земли.

Смотри, как это выглядело, прям ностальгия накатывает, файл 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">

    <!-- Вот объявляем бин, типа, давай, MyServiceImpl, выходи, сука, на сцену -->
    <bean id="myService" class="com.example.MyServiceImpl">
        <!-- А тут ему впендюриваем зависимость через сеттер, чтоб не скучал -->
        <property name="repository" ref="myRepository"/>
    </bean>

    <!-- А это его кореш, репозиторий, который где-то там данные тырит -->
    <bean id="myRepository" class="com.example.MyRepositoryImpl"/>

</beans>

А подгружалось это великолепие вот так, блядь:

// Тырим контекст из classpath, как последнюю конфету из вазы
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// И достаём оттуда наш бин, надеясь, что он там не один сидит
MyService service = context.getBean("myService", MyService.class);

Ну а сейчас-то что? Сейчас, блин, всё проще. Аннотации развесил — @Component, @Autowired — и Spring сам всё расчехлит. Или Java-конфигурация через @Configuration — тоже вариант, без этого XML-овского шаманства. Но знать-то старьё надо, а то вдруг на legacy проекте окажешься, там без этого никуда, ебать мои старые костыли.