JavaRush /Курси /Модуль 5. Spring /Конфігурація Spring-застосунків з використанням XML і Jav...

Конфігурація Spring-застосунків з використанням XML і Java (анотації)

Модуль 5. Spring
Рівень 1 , Лекція 4
Відкрита

Перш ніж писати код, давайте розберемося, навіщо взагалі потрібна конфігурація. Spring-застосунок нагадує електричну схему, де кожен компонент (або бін) виконує свою функцію, а конфігурація визначає, як з'єднати ці компоненти, щоб усе запрацювало. Конфігурація описує, як ці компоненти взаємодіють один з одним і як правильно підстроїти застосунок під потреби проєкту.

У Spring є три основні способи конфігурації:

  1. XML-конфігурація — "олдскульний" спосіб. Підійде тим, хто любить писати купу XML-файлів.
  2. Анотації — сучасний і більш зручний підхід, який зменшує обсяг "паперової метушні".
  3. Java-код (Java-based конфігурація) — потужний спосіб кастомізації, що дає більшу гнучкість у керуванні.

Коли варто використовувати кожен із них?

  • XML корисний для проєктів, де розділення конфігурації і коду принципово важливе.
  • Анотації хороші, коли потрібно швидко налаштувати компонент без перевантаження файлами.
  • Java-код ідеально підходить для складних застосунків, де потрібна динамічна настройка.

Конфігурація за допомогою XML

XML-конфігурація — це найстаріший, але надійний спосіб. Раніше всі налаштування Spring-застосунків зберігалися в .xml-файлах. Спочатку це може здаватися зайво складним, але для розуміння основ роботи IoC-контейнера Spring це корисно.

Приклад: Налаштування біна в XML

Задача: зареєструвати бін, який представляє собою простий сервіс.

Визначимо клас сервісу:


package com.example.service;

public class GreetingService {
    public void sayHello() {
        System.out.println("Hello from GreetingService!");
    }
}

Створимо XML-конфігурацію (applicationContext.xml):


<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">

 <!-- Визначаємо бін GreetingService -->
 <bean id="greetingService" class="com.example.service.GreetingService" />

</beans>

Використаємо бін у коді:


package com.example;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.example.service.GreetingService;

public class App {
    public static void main(String[] args) {
        // Завантажуємо контекст з XML
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        // Отримуємо бін з контексту
        GreetingService greetingService = context.getBean("greetingService", GreetingService.class);

        // Викликаємо метод біна
        greetingService.sayHello();
    }
}

Такий підхід показує, як працює IoC-контейнер Spring: він створює об'єкт GreetingService і керує його життєвим циклом.


Конфігурація за допомогою анотацій

Хто не любить магію? У випадку зі Spring анотації роблять життя набагато простішим. Анотації дозволяють відмічати класи та їхні члени для автоматичної конфігурації.

Основні анотації

  • @Component — вказує на клас, який має бути зареєстрований як бін.
  • @Autowired — впроваджує залежності в бін.
  • @ComponentScan — вказує, де шукати компоненти (біни).

Приклад: використання анотацій для конфігурації

Змінімо клас сервісу:


package com.example.service;

import org.springframework.stereotype.Component;

@Component // Автоматична реєстрація класу як біна
public class GreetingService {
    public void sayHello() {
        System.out.println("Hello from GreetingService with annotations!");
    }
}

Налаштуємо основний клас застосунку:


package com.example;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.example.service.GreetingService;

@Configuration
@ComponentScan(basePackages = "com.example") // Сканує пакет і шукає компоненти
public class AppConfig {
    @Autowired
    private GreetingService greetingService;

    public void run() {
        greetingService.sayHello();
    }

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

        // Отримуємо бін AppConfig
        AppConfig app = context.getBean(AppConfig.class);
        app.run();

        context.close();
    }
}

Результат той самий, що й з XML, але ми позбулися зайвих файлів. Справжня магія!


Конфігурація за допомогою Java (анотація @Configuration)

Java-код — потужний інструмент в руках досвідченого розробника. Тут ми створюємо конфігураційні класи і налаштовуємо біни вручну за допомогою методів.

Приклад використання @Configuration і @Bean

Ми хочемо зареєструвати бін, але не хочемо сканувати весь проєкт.

Клас сервісу залишається незмінним:


package com.example.service;

public class GreetingService {
    public void sayHello() {
        System.out.println("Hello from GreetingService with Java-based config!");
    }
}

Створимо Java-конфігурацію:


package com.example.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.example.service.GreetingService;

@Configuration
public class AppConfig {

    @Bean
    public GreetingService greetingService() {
        return new GreetingService(); // Ручне створення біна
    }
}

Основний клас застосунку:


package com.example;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.example.service.GreetingService;
import com.example.config.AppConfig;

public class App {
    public static void main(String[] args) {
        // Ініціалізуємо контекст з Java-конфігурацією
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

        // Отримуємо бін
        GreetingService greetingService = context.getBean(GreetingService.class);

        // Використовуємо бін
        greetingService.sayHello();
    }
}

Гнучкість Java-конфігурації

Можна додавати складну логіку при створенні біна. Наприклад, бін може залежати від конфігурацій чи зовнішніх налаштувань:


@Bean
public GreetingService greetingService() {
    if (System.getProperty("user.language").equals("ru")) {
        return new RussianGreetingService();
    }
    return new EnglishGreetingService();
}

Тепер бачимо, що Java-конфігурація більше орієнтована на великі проєкти, де потрібна гнучкість.


Порівняння підходів: XML, Анотації, Java

Підхід Переваги Недоліки
XML Добре підходить для конфігурацій, які мають бути відокремлені від коду Багато рутини. Потрібно писати XML навіть для простих речей
Анотації Простота, менше коду для базових задач Усі налаштування "сховані" в коді, що ускладнює підтримку
Java Найкращий вибір для складних застосунків, адаптивність Може стати складним при великій кількості бінів

Який спосіб обрати? Якщо ви — новачок або пишете невеликий застосунок, анотації — ідеальний вибір. Для складних систем краще використовувати Java-конфігурацію, бо вона гнучкіша і зручніша для кастомізації.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ